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

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

问题描述:

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

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

+1

类似的问题在这里:https://开头的http://stackoverflow.com/questions/308276/c-call-constructor-from-constructor – 2015-01-09 15:24:24

不是before C++11

改为将通用功能提取为单独的功能。我通常将这个函数命名为构造()

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

但是,可以调用析构函数而不会出现问题。

+2

+1 - 和'construct()'是个好名字。 – peterchen 2009-12-13 12:51:12

+5

+1 - 您应该补充说,可以在下一个C++版本(C++ 0x)中从同一个类中的构造函数中调用构造函数。请参阅http://www2.research.att.com/~bs/C++0xFAQ.html#delegating-ctor – Klaim 2009-12-13 23:53:29

+0

您可以举一个construct()函数的例子吗?我知道这很简单,但我认为人们会觉得它很有用。 – MattClimbs 2017-04-08 23:36:30

之前没有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; 
} 

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

+1

我认为它非常便携; placement-new在ISO C++标准中。“然而,其他用途包括直接调用构造函数,这是C++语言不允许的。” 维基百科:http://zh.wikipedia.org/wiki/Placement_syntax – haavee 2010-06-24 13:20:06

+4

如果A派生自B类,会发生什么? B的构造函数将被调用,然后A将调用新的A'(另一个构造函数),并覆盖B已经完成的所有内容,然后再调用B,然后调用A'。结论:如果B做了一些有意义的事情(即分配资源),这会破坏代码(即引发资源泄漏)。 – paercebal 2010-10-16 08:19:12

+0

@paercebal是的,如果A是抽象类,这也是行不通的。 – 2010-10-16 10:03:13

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

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 
}; 

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

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

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

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(){...} 
} 
+1

我认为赋值'* this = A();'它会使用默认的拷贝构造函数(如果你还没有定义一个),这可能不是你想要的吗? – austinmarton 2016-04-20 22:43:13