C ++中的延迟构造函数

时间:2009-05-06 14:35:40

标签: c++ constructor default

我一直在审查一些看起来像这样的代码:

class A; // defined somewhere else, has both default constructor and A(int _int) defined
class B
{
public:
    B(); // empty
    A a;
};

int main()
{
     B* b;
     b = new B();
     b->a(myInt); // here, calling the A(int _int) constructor,
     //but default constructor should already have been called
}

这有用吗?在调用默认值之后调用特定的构造函数?

4 个答案:

答案 0 :(得分:15)

该代码不会调用构造函数。它会调用A::operator()(int)

但是如果你明确地在已经构造的对象上调用构造函数,那么你很好地进入了未定义的行为 - land。它似乎在实践中起作用,但不能保证它能达到预期效果。

答案 1 :(得分:2)

你可以在B组中制作另一个构造函数

B(int _int):a(_int) {}

在你写的那种情况下 b =新B(myInt);

上面的代码不会延迟A类的构造函数代码。

你不需要打电话给b-> a(myInt)

答案 2 :(得分:1)

这不是调用构造函数,而this回答涵盖了对正在发生的事情的唯一可能解释。

在现有对象上调用构造函数的唯一标准方法是使用placement new,(在前一个实例被破坏之后):

void foo (A * a) {
  a->~A ();           // Destroy previous instance
  new (a) A(myInt);   // Construct new object in same location
} 

答案 3 :(得分:0)

您应该从B()构造函数中调用A(int)构造函数,或者创建一个也调用A(int)构造函数的B(int)构造函数。

最佳做法是同时使用两者,默认值为A设置默认int,B(int)设置为init A(int)。