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

Mai*_*nID 36 c++ constructor

class A{
  A(int a = 5){
    DoSomething();
    A();
  }
  A(){...}
}
Run Code Online (Sandbox Code Playgroud)

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

Pav*_*sky 63

不是在C++ 11之前.

将常用功能提取到单独的功能中.我通常将此函数命名为construct().

"所谓的"第二次调用将编译,但在C++中具有不同的含义:它将构造一个新对象,一个临时对象,然后在语句结束时立即删除.所以不行.

但是,可以毫无问题地调用析构函数.

  • +1 - 你应该补充说,可以在下一个C++版本(C++ 0x)中从同一个类的构造函数中调用构造函数.见http://www2.research.att.com/~bs/C++0xFAQ.html#delegating-ctor (5认同)

Ale*_*x B 16

不是之前C++0x,没有.

但是,出于学术兴趣,我想出了一个非常可怕的方法*使用贴片操作员"new"来做这件事(有人想指出这是多么便携?)

#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;
}
Run Code Online (Sandbox Code Playgroud)

*不,不,我不在生产代码中写这个.

  • 如果A来自B类会发生什么?将调用B的构造函数,然后调用A,然后调用新的A'(另一个构造函数),并覆盖B已经完成的所有操作,然后再次调用B,然后调用A'.结论:如果B做了一些有意义的事情(即分配资源),这将破坏代码(即引发资源泄漏). (4认同)

小智 6

答案实际上是"是",但正如其他人所建议的那样,它并不能满足您的需求.您当然可以隐式或显式地使用基类的构造函数:

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
};
Run Code Online (Sandbox Code Playgroud)