2013-02-14 183 views
0

我學習C++(從Java來),這是竊聽了地獄了我,說我有...C++成員變量混亂

class Foo { 

public: 

    Bar &x; // <- This is a ref, Bar is not instantiated (this is just a placeholder) 
    Bar *y; // <- This is a pointer, Bar is not instantiated (this is just another placeholder) 
    Bar z; // <- What is this??? 

}; 

class Bar { 

public: 

    Bar(int bunchOfCrap, int thatNeedsToBeHere, double toMakeABar); 

}; 

在這個例子酒吧具有一個構造函數需要一個爲了創建一個「Bar」而指定的一堆字段。 x和y都不創建一個Bar,我知道x創建一個可以指向Bar的引用,並且y創建一個也可以表示Bar的指針。

我不明白究竟是z是什麼。

  • 這是酒吧嗎?如果是這樣,Bar怎麼能給出唯一的構造函數呢?

  • 它是屬於富的情況下內存條大小的塊,也可以被初始化到酒吧?

  • 或者是別的什麼?

謝謝!

+1

你試過編譯你的例子嗎?這可能會爲您提供一些見解。 (它至少會用「它不能」來回答你的「如何」問題。) – jamesdlin 2013-02-14 03:11:48

+1

使用Bar&x,你必須在構造Foo時指定x。 – 2013-02-14 03:12:56

+1

我相信一個默認的構造函數正在被調用。編輯:沒關係,如果用戶定義了一個,沒有默認的構造函數。 – AlexLordThorsen 2013-02-14 03:13:20

回答

3

內排列爲教學起見,讓我們嘗試編譯這段代碼:

class Bar { 
public: 
    Bar(int bunchOfCrap, int thatNeedsToBeHere, double toMakeABar); 
}; 

class Foo { 
public: 
    Bar &x; // <- This is a ref, Bar is not instantiated (this is just a placeholder) 
    Bar *y; // <- This is a pointer, Bar is not instantiated (this is just a *safer* placeholder) 
    Bar z; // <- What is this??? 
}; 

int main() { 
    Foo foo; 
} 

輸出:

c++  uuu.cpp -o uuu 
uuu.cpp:10:7: error: implicit default constructor for 'Foo' must explicitly initialize the reference member 'x' 
class Foo { 
    ^
uuu.cpp:14:10: note: declared here 
    Bar &x; // <- This is a ref, Bar is not instantiated (this is just a placeholder) 
     ^
uuu.cpp:10:7: error: implicit default constructor for 'Foo' must explicitly initialize the member 'z' which does not 
     have a default constructor 
class Foo { 
    ^
uuu.cpp:16:9: note: member is declared here 
    Bar z; // <- What is this??? 
     ^
uuu.cpp:2:7: note: 'Bar' declared here 
class Bar { 
    ^
uuu.cpp:21:9: note: implicit default constructor for 'Foo' first required here 
    Foo foo; 
     ^
2 errors generated. 
make: *** [uuu] Error 1 

,因爲它說,你必須初始化成員參考Bar &x和成員變量Bar z;,因爲Bar沒有默認構造函數。 y不需要初始化,它將默認爲NULL

xy間接指對象。您不能更改x所引用的內容(因此在實例化Foo時必須對其進行初始化)。您可以更改y引用的內容。 z是一個Bar大小的內存,它住在Foo;爲了您合法地聲明這樣的成員變量,您必須在Foo之前提供Bar的完整定義,以便編譯器知道Bar有多大。

1

zBar一個實例,並且當Foo是,因此必須被構造:

class Foo { 
public: 
    Foo(…) 
     : x(<instance of or reference to Bar>), 
      y(<pointer to Bar>), // optional 
      z(<Bar ctor params>) 
    { … } 

注意,既xz必須建造期間被初始化,而它是合法的(雖然有問題的)省略y的初始化。

z佔用相同的內存作爲父Foo實例,但它是Bar一個實例,而不僅僅是一個Bar的記憶尺度的塊。

1
  1. 是的,它是一個欄:zBar類型的標識符。如果你沒有定義一個默認的構造函數,這會產生一個編譯器錯誤(編譯器通常會這樣做,但是如果你至少定義了一個構造 - >你有)。
  2. 是的,它的內存大小酒吧大塊,當被分配Foo分配。
1

這是酒吧嗎?如果是這樣,Bar怎麼能給出唯一的構造函數呢?

是,z是一間酒吧。如果Bar沒有默認構造函數,則必須在Foo member initializers list中初始化Bar。下面的示例忽略X,Y初始化:

Foo::Foo(int param1, int param2, int param3) 
: z(param1, param2, param3) 
{ 
} 

它是屬於富的實例內存大小酒吧塊可以初始化成吧?

是,酒吧對象Foo對象