构造函数可以在c ++中调用另一个构造函数吗?

class A{ A(int a = 5){ DoSomething(); A(); } A(){...} } 

第一个构造函数可以调用第二个吗?

不在C ++ 11之前 。

相反,将通用function提取为单独的function。 我通常命名这个函数构造()

“所谓的”第二次调用会编译,但在C ++中有不同的意义:它会构造一个新的对象,一个临时的,然后在声明结束时被立即删除。 所以不行。

然而,析构函数可以被调用而没有问题。

不在C++0x之前,不。

但是, 出于学术兴趣,我提出了一个非常可怕的方法*使用“新”(有人在意指出这是多么便携)的位置运算符来做到这一点?

 #include <new> #include <iostream> class A { public: A(int i, int j) : i_(i), j_(j) { } A(int i) { new (this) A(i, 13); } int i_,j_; }; int main() { A a1(10,11), a2(10); std::cout << a1.i_ << ", " << a1.j_ << std::endl << a2.i_ << ", " << a2.j_ << std::endl; return 0; } 

*地狱不,我不写在生产代码。

答案其实是“是的”,但正如其他人所说的那样,它并没有达到你想要的。 您当然可以隐式或显式使用基类的构造函数:

 struct B { B() {} B( int x ) {} }; struct A : public B { A() {} // calls B() implicitly A( int a, int b ) : B( b ) {} // calls B(int) explicitly }; 

不直接。 有几种方法可以解决这个问题。

从类的构造函数的初始化列表中,可以在任何基类和所有成员variables上调用构造函数。

所以你通常可以重构你的class级,把它分成几个小class来解决问题。 通常执行的代码可以放在成员对象或基类中。 然后,每个主类的构造函数都必须决定使用哪个构造函数来初始化该成员。

 class B { B() { } B(int b) { DoSomething(); } } class A{ A(int a = 5) : b(a) { } // call B's constructor which does something A() : b() {} // call B's constructor which does nothing B b; }; 

这是一个古老的问题。 然而,

 class A{ A(int a = 5){ DoSomething(); A(); } A(){...} } 

可能

 class A{ A(int a = 5){ *this = A(); DoSomething(); } A(){...} }