调用C++;来自其他成员函数/构造函数的构造函数是否执行初始值设定项列表? 在C++对象中,当您从另一个构造函数或成员函数调用构造函数(在对象已经构建之后),您调用的构造函数的初始化列表是否仍然被执行?< P>不要从另一个方法或另一个构造函数显式调用构造函数。

调用C++;来自其他成员函数/构造函数的构造函数是否执行初始值设定项列表? 在C++对象中,当您从另一个构造函数或成员函数调用构造函数(在对象已经构建之后),您调用的构造函数的初始化列表是否仍然被执行?< P>不要从另一个方法或另一个构造函数显式调用构造函数。,c++,list,constructor,initializer,C++,List,Constructor,Initializer,如果确实需要,请改用两阶段初始化,在初始化过程中,在构造对象后调用Init()type方法。只能通过new或在堆栈上构造对象来显式调用构造函数。有很多方法可以破解它(例如placement new),但不要这样做,只需使用两阶段构造和初始化。我假设您指的是从派生类的初始化列表中调用基类构造函数。假设是这种情况,则首先执行基类构造函数(包括其初始值设定项列表),然后调用派生类的初始值设定项列表 在您想知道的情况下,基类构造函数总是在为派生类执行初始化器列表之前调用,即使对基类构造函数的调用显式出现

如果确实需要,请改用两阶段初始化,在初始化过程中,在构造对象后调用
Init()
type方法。

只能通过new或在堆栈上构造对象来显式调用构造函数。有很多方法可以破解它(例如placement new),但不要这样做,只需使用两阶段构造和初始化。

我假设您指的是从派生类的初始化列表中调用基类构造函数。假设是这种情况,则首先执行基类构造函数(包括其初始值设定项列表),然后调用派生类的初始值设定项列表


在您想知道的情况下,基类构造函数总是在为派生类执行初始化器列表之前调用,即使对基类构造函数的调用显式出现在派生类的初始化列表的中间或结尾(以及如果它出现在开始时)。原因是初始值设定项列表中的项是按照它们在类的头文件的类声明中出现的顺序执行的,而不是按照它们在构造函数定义的初始值设定项列表中出现的顺序执行的。而且,类构造函数从不在派生的类声明中声明。C++要求基类构造函数总是在派生类构造函数之前调用——对基类构造函数的调用是否在派生类的初始化列表中显式地出现,或否-无论它出现在初始值设定项列表中的何处。

在C++11中,您可以让一个构造函数将工作委托给同一类中的另一个构造函数,例如:1:

这是一个错误


如果问题是“给定继承关系,初始化器列表是否仍被调用?”答案是肯定的,例如

#include <iostream>
struct SomeBase {
  SomeBase(int) {}
};

struct SomeType : SomeBase {
    int number;

    SomeType(int new_number=0) : SomeBase(new_number), number(new_number) {}
};

int main() {
  SomeType a;
  std::cout << a.number << std::endl;
}
#包括
结构SomeBase{
SomeBase(int){}
};
结构SomeType:SomeBase{
整数;
SomeType(int new_number=0):SomeBase(new_number),number(new_number){}
};
int main(){
a型;
标准::cout
SomeType() : SomeType(42), number(0) {}
#include <iostream>
struct SomeBase {
  SomeBase(int) {}
};

struct SomeType : SomeBase {
    int number;

    SomeType(int new_number=0) : SomeBase(new_number), number(new_number) {}
};

int main() {
  SomeType a;
  std::cout << a.number << std::endl;
}
#include <iostream>

struct SomeType {
    int number;

    SomeType(int new_number) : number(new_number) {}
    SomeType() {
      SomeType::SomeType(0); // Error!
    }
};

int main() {
  SomeType a;
  std::cout << a.number << std::endl;
}
#include <iostream>

struct SomeType {
    int number;

    SomeType(int new_number) : number(new_number) {}
    SomeType() {
      SomeType(0); 
      number = 42;
    }
};

int main() {
  SomeType a;
  std::cout << a.number << std::endl;
}