2012-04-21 193 views
0

只有在創建對象後纔將內存分配給類中的變量..right? 那麼如果該類包含一個變量,該變量是另一個類的對象並且該變量具有構造函數呢?在C++中調用的構造函數

class Wand 
{ 
    mouse mouseEmu(0,0); 
    QCursor pt; 
}; 

mouseEmuQCursor兩類...

當將是mouseEmu構造函數調用,當將是pt默認的構造函數叫什麼名字?

如果我們指定了參數化構造函數,是否有必要調用它?

回答

1

這不是合法的C++語法。它看起來像是聲明瞭一個函數,但0不是有效的類型標識符。

子對象(基和成員變量)的構造函數是從您的類的構造函數中調用的,包括編譯器生成的構造函數。

ctor-initializer-list允許您爲子對象構造函數指定參數。它看起來像這樣:

class Wand 
{ 
    mouse mouseEmu; 

    QCursor pt; 
public: 
    Wand() : mouseEmu(0,0) {} 
}; 

這樣,你的mouseEmu子對象有兩個參數的構造函數初始化,pt是其默認的(零參數)構造函數初始化。

編譯器生成的複製構造函數將通過調用複製構造函數並傳遞被複制對象的成員來初始化兩個子對象。

2

什麼時候會調用mouseEmu的構造函數,何時調用pt的默認構造函數?

當前構造對象的所有數據成員和基類子對象全部在當前對象的構造函數的主體進入之前完全構造。因此,如果你的類有一個用戶定義的構造函數,那麼當用戶定義的構造函數中的代碼被執行時,類的所有其他子對象的構造函數都已完成。

如果由於某種原因,你需要設置的子對象的用戶定義的初始值,而子對象具有非默認構造函數,那麼你可以使用一個初始化列表與當前對象的構造函數將值傳遞給子對象的構造函數。例如:

class Wand 
{ 
    mouse mouseEmu; 
    QCursor pt; 

    Wand(): mouseEmu(0,0) {} //empty constructor body with initialization list 
}; 
+0

不只是成員的子對象,底座子也-objects – 2012-04-21 16:02:39

+0

有什麼錯魔杖::魔杖(){ mouseEmu(0,0);}。 – 2012-04-21 16:11:07

+0

即重新初始化mouseEmu對象因此應該給錯誤 – CppLearner 2012-04-21 16:13:50

2

新問題(或舊取決於當你到達)

class Wand 
{ 
    mouse mouseEmu(0,0); 
      // ^^^^^^ This bit is illegal. 
      //   Remove it here. You specify the parameters 
      //   Passed to members in the constructor. 
    QCursor pt; 
}; 

你想要的是:

class Wand 
{ 
    Ward(): mouseEmu(0,0) {} 
    mouse mouseEmu; 
    QCursor pt; 
}; 

編輯:

答案基礎上,它被改爲非法之前的問題。

如果你不提供一個構造函數,則編譯器廠爲你一個隱含的默認構造函數:當您創建魔杖對象

Wand::Wand() 
    : mouseEmu() 
    , pt() 
{} 

古都。它將自動創建並初始化其成員(mouseEmu和pt),作爲構建魔杖對象的一部分。調用它們的構造函數(按照在類中聲明的順序)。

注意:如果你定義自己的構造函數。但是,不要顯式調用你的會員的構造函數,則成員默認構造函數被隱式調用(建築構件中的順序總是聲明的順序。

// Example: 
// If you did: 

class Wand 
{ 
     Wand(int x) : mouseEmu(0,x) {} 

     // The above will generate this logical code. 
     Wand(int x) : mouseEmu(0,x), pt() {} 
} 
+0

好的..感謝您的回答 – 2012-04-21 16:16:55

+0

這個問題並沒有改變成非法的語法,它開始那樣。 – 2012-04-21 16:31:31

+0

對不起Loki的困惑,那是我的錯... – Jason 2012-04-21 16:38:31