2013-10-06 77 views
0
class ClassB 
{ 
    int option; 

public: 
    ClassB(void){} //without the default constructor, the example does not compile. 
    ClassB(int option) 
    { 
     this->option = option; 
    } 
}; 

class ClassA 
{ 
    ClassB objB; //initialize objB using default constructor. When does this actually occur? 

public: 
    ClassA(int option) 
    { 
     objB = ClassB(option); //initialize objB again using another constructor. 
    } 
}; 

int main(void) 
{ 
    ClassA objA (2); 

    return 0; 
} 

我是新來C++(來自c#),我對如何初始化類變量有點困惑。在上面的例子中,ClassA聲明一個類型爲ClassB的類對象,按值存儲。爲了做到這一點,ClassB必須有一個默認構造函數,這意味着ClassA首先使用默認構造函數創建一個ClassB。但是ClassA從不使用這個默認的objB,因爲它在ClassA的構造函數中被立即覆蓋。C++類變量和默認構造

所以我的問題:是否objB實際初始化了兩次?

如果是這樣,是不是一個不必要的步驟?將objB聲明爲指針會更快嗎?

如果不是,爲什麼ClassB需要一個默認構造函數?

+0

如果你從來沒有成員初始化之前看到很明顯你沒看過任何像樣的C++的書。這是你要做的一個巨大的錯誤......通過實驗來接觸C++是一種自殺(因爲有時它只是不合邏輯的,而且是因爲UB)。幫你自己一個忙,並從封面讀一本好書,首先介紹(http://stackoverflow.com/q/388242/320726)。其中一些是免費的PDF下載。 – 6502

+0

我會看看那些,謝謝。 –

回答

3

原因是您沒有初始化objB數據成員,但是在默認構建後將其分配給

ClassA(int option) 
{ 
    // By the time you get here, objB has already been constructed 
    // This requires that ClassB be default constructable. 

    objB = ClassB(option); // this is an assignment, not an initialization 
} 

進行初始化,使用構造函數成員初始化列表:

ClassA(int option) : objB(option) {} 

這初始化objB用正確的構造,並且不需要ClassB是默認施工的。請注意,這同樣適用於ClassB,其構造應

ClassB() : option() {} // initializes option with value 0 
ClassB(int option) : option(option) {} 
+0

確實如此,但ClassA仍然最終構造了兩個ClassB:默認的,然後是非默認的,對嗎? –

+0

@MadisonBrown不,正如我所說的,沒有要求'ClassB'是默認構造。只有一個'ClassB'被實例化。 – juanchopanza

+0

啊我現在看到了。謝謝。 –