![](/img/trans.png)
[英]C++ class member scope when instatiated object in constructor
[英]When will C++ call the constructor on an object that is a class member?
假設我有一個 class
class MyClass {
public:
AnotherClass myObject;
};
我的問題是我想用 arguments 將 myObject 初始化為它的構造函數,就像我在 function 期間在堆棧上聲明它一樣
AnotherClass myObject(1, 2, 3);
但我想為構造函數中的 class 成員執行此操作:
MyClass::MyClass() {
myObject = ...?
...
}
問題正是如此。 如果我聲明一個具有構造函數的 class 成員,C++ 會調用默認構造函數嗎? 如何仍然在 class 定義中聲明變量,但在構造函數中對其進行初始化?
感謝您的任何回答!
您可以使用初始化列表。
class MyClass {
public:
MyClass() : myObject(1,2,3){ }
AnotherClass myObject;
};
使用ctor-initializer 。 成員在基類之后和構造函數主體運行之前被初始化。
MyClass::MyClass() : myObject(1,2,3) {
...
}
Google for構造函數初始化列表
http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/
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)
{
}
總是使用初始化列表:
MyClass::MyClass() :
myObject( 1, 2, 3 )
{
//myObject = don't do this, bad practice!
}
我能想到的最好方法是初始化 class ctor 中的成員,如下所示:
class MyClass
{
public:
MyClass(int param)
: m_Object(param)
{ };
private:
OtherClass m_Object;
};
然后,您可以使用所需的任何 ctor 顯式初始化成員(以及為兩個類提供具有不同參數的多個 ctor)。
或提供適當的構造函數:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.