C ++何时会在类成员的对象上调用构造函数?

时间:2011-07-12 18:33:40

标签: c++ class constructor

让我说我有一个班级

class MyClass {
    public:
        AnotherClass myObject;
};

我的问题是我想用它的构造函数的参数初始化myObject,正好是我在函数期间在堆栈中声明它

AnotherClass myObject(1, 2, 3);

但我想为构造函数中的类成员执行此操作:

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

问题正是如此。如果我声明一个具有构造函数的类成员,C ++会调用默认构造函数吗?我怎样才能在类定义中声明变量,但在构造函数中初始化它?

感谢您的回答!

7 个答案:

答案 0 :(得分:8)

您可以使用初始化列表。

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

答案 1 :(得分:8)

使用 ctor-initializer 。成员在基类之后和构造函数体运行之前初始化。

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

答案 2 :(得分:4)

答案 3 :(得分: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)
{
}

答案 4 :(得分:3)

始终使用初始化列表:

MyClass::MyClass() :
  myObject( 1, 2, 3 )
{
  //myObject = don't do this, bad practice!
}

请参阅http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6

答案 5 :(得分:1)

我能想到的最好的方法是初始化类ctor中的成员,如下所示:

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

private:
    OtherClass m_Object;
};

然后,您可以使用您想要的任何一个ctor显式初始化该成员(以及为这两个类提供具有不同参数的多个ctors)。

答案 6 :(得分: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);