我一直在审查一些看起来像这样的代码:
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
}
这有用吗?在调用默认值之后调用特定的构造函数?
答案 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)。