2

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

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

4 回答 4

15

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

但是,如果您在已构建的对象上显式调用构造函数,那么您将进入未定义的行为领域。它在实践中似乎可行,但不能保证它会达到您的预期。

于 2009-05-06T14:40:20.907 回答
2

您可以在 B 类中创建另一个构造函数

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

在这种情况下,当您编写 b = new B(myInt);

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

你不需要调用 b->a(myInt)

于 2009-05-06T14:40:49.283 回答
1

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

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

void foo (A * a) {
  a->~A ();           // Destroy previous instance
  new (a) A(myInt);   // Construct new object in same location
} 
于 2009-05-06T14:40:24.977 回答
0

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

最佳实践是两者都有,默认一个为 A 设置默认 int,而 B(int) 一个为初始化 A(int)。

于 2009-05-06T14:46:31.860 回答