2011-07-12 78 views
4

比方說,我有一個類C++何時會在類成員的對象上調用構造函數?

class MyClass { 
    public: 
     AnotherClass myObject; 
}; 

我的問題是,我想初始化參數給它的構造myObject的,正是我如果一個函數在堆棧上聲明它

AnotherClass myObject(1, 2, 3); 

但我想爲構造函數中的類成員執行此操作:

MyClass::MyClass() { 
    myObject = ...? 
    ... 
} 

問題正是如此。如果我聲明一個具有構造函數的類成員,C++會調用默認的構造函數嗎?我怎樣才能在類定義中聲明變量,然後在構造函數中初始化它?

感謝您的任何答案!

回答

8

使用構造函數初始化程序。成員在基類之後和構造函數體運行之前被初始化。

MyClass::MyClass() : myObject(1,2,3) { 
    ... 
} 
+0

GWW的答案是這樣的 – antlersoft

+0

@antlersoft的例子:是的,它是(我們在同一時間輸入我們的答案,顯然他在我之前幾秒鐘完成),但是他沒有回答標題問題「C++何時調用成員子對象的構造函數? –

8

您可以使用初始化程序列表。

class MyClass { 
    public: 
     MyClass() : myObject(1,2,3){ } 
     AnotherClass myObject; 
}; 
3
class A 
{ 
public: 
    A(int); 
}; 

class B 
{ 
public: 
    B(); 

private: 
    A my_a_; 
}; 

// initialize my_a by passing zero to its constructor 
B::B() : my_a_(0) 
{ 
} 
1

我能想到的最好的方法是初始化成員在類構造函數,像這樣:

class MyClass 
{ 
public: 
    MyClass(int param) 
     : m_Object(param) 
    { }; 

private: 
    OtherClass m_Object; 
}; 

然後,您可以明確初始化您要使用哪個構造函數(成員以及提供多個構建函數兩個班都有不同的參數)。

0

或提供適當的構造函數:

struct Foo{ 
    Foo(const Bar& b): myBar(b){} 
    Bar myBar; 
} 
//... 
Foo myFoo1(Bar(1,2,3)); 
Foo myFoo2(Bar(3,2,1)); 

或者,如果你不想暴露吧,那麼你可以設置參數,例如

struct Square{ 
    Square(const int height, const int width): myDimension(width,height){} 
    Dimension myDimension; 
} 
//... 
Square sq(1,2); 
Square sq(4,3); 
相關問題