在C++对象中,当您从另一个构造函数或成员函数调用构造函数时(在构造该对象之后),您调用的构造函数的初始化程序列表是否仍然执行?从另一个成员函数/构造函数调用C++构造函数是否执行初始化程序列表?
回答
不要从另一个方法或另一个构造函数显式调用构造函数。
如果您真的需要使用两阶段初始化,在构造对象之后调用Init()
类型的方法。
只能通过新建或堆栈中的对象构造来显式调用构造方法。有办法破解它(例如放置新的),但不这样做,只需使用两阶段构建&初始化。
我假设你指的是从派生类的初始化列表中调用基类构造函数。假设情况如此,那么首先执行BASE类构造函数(包括其初始化程序列表),然后调用派生类的初始化程序列表。
如果您想知道 - 基类构造函数在派生类执行初始化程序列表之前调用ALWAYS,即使对基类构造函数的调用显式出现在派生类的中间或末尾初始化列表(以及它是否出现在开头)。原因是初始化程序列表中的项目按照它们出现在类头文件的DECLARATION类中的顺序执行,而不是按它们在构造函数定义中的初始化程序列表中出现的顺序执行。而基类类构造函数从未在派生的类声明中声明。 C++要求在派生类构造函数之前调用基类构造函数 - 无论对基类构造函数的调用是否显式出现在派生类的初始化列表中,也不要在初始化程序列表中出现的位置。
在C++ 11中,您可以将构造函数委托工作到同一个类中的另一个构造函数,例如, :
#include <iostream>
struct SomeType {
int number;
SomeType(int new_number) : number(new_number) {}
SomeType() : SomeType(42) {}
};
int main() {
SomeType a;
std::cout << a.number << std::endl;
}
在这种情况下,禁止该代表团之后有一个initaliser列表,例如将前面的示例更改为:
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;
}
这很好,它的工作原理就是你希望的。
这是不合法的直接调用构造函数从另一个构造函数中,并在C++之前,C++ 11没有构造代表团允许要么,所以像:
#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;
}
这里不带参数的构造函数构造SomeType的匿名临时实例。它是最初调用构造函数的一个完全独立的实例。这是完全合法的,但可能不是你想要做的。如果你这样做,如果你不小心,你可能会创建无限递归的风险,如果你最终做了这样的事情,我认为这可能是一个设计问题的好指标!
从维基百科C++11 article
派生- 1. 在构造函数初始化程序中使用成员的成员函数
- 2. 从另一个构造函数调用默认构造函数
- 3. 长构造函数初始化列表
- 4. 初始化列表到构造函数
- 5. 通过构造函数初始化成员函数
- 6. 有多个构造函数初始化成员变量调用
- 7. 初始化列表:从基类的构造函数和成员函数
- 8. 调用构造函数并初始化
- 9. 构造函数初始化列表中的执行顺序
- 10. 在构造函数中调用类成员的构造函数
- 11. 在构造函数中调用另一个构造函数
- 12. 在构造函数范围初始化而不是成员初始化列表
- 13. C++的构造函数初始化多个成员
- 14. 从参数化构造函数调用默认构造函数
- 15. C + + 11:std ::线程内执行一个函数成员与线程初始化在构造函数
- 16. 初始化构造函数C++
- 17. C++模板构造函数初始化
- 18. c#构造函数与初始化
- 19. 当一个构造函数被显式调用时,是否构造了构造函数和成员变量?
- 20. 初始化程序列表是否抑制对构造函数的调用?
- 21. 成员构造函数和析构函数调用的顺序
- 22. 初始化列表和构造函数调用顺序
- 23. 构造函数被“调用”与构造函数被“执行”?
- 24. 使用构造函数的参数初始化矢量成员
- 25. 使用构造函数参数初始化类成员
- 26. Cpp。哪个被首先调用/初始化?类构造函数或其成员类的构造函数?
- 27. constexpr构造函数初始化列表中的Constexpr函数
- 28. 使用函数构造函数初始化调用
- 29. 在构造函数C++中初始化成员向量
- 30. 构造函数中私人成员初始化的差异(C++)