在初始化所有成员变量之后,从构造函数体调用非虚函数(包括赋值运算符)是否安全?
答案 0 :(得分:1)
是的,构造函数可以调用非虚函数。
确保在调用赋值运算符之前已正确初始化所有成员,否则对象将处于不一致状态。
如果要从构造函数调用虚函数,请使用“Virtual Constructor idiom”。
答案 1 :(得分:1)
是 - 您可以自由调用其他非虚拟成员函数。如果派生程度最高的基类提供了您想要的实现,则可以调用虚函数。
实际上,在C ++ 11让一个构造函数调用另一个之前,几个构造函数调用支持函数来执行共享初始化并不罕见。
在这些情况下可以调用 operator=
- 关键的是在分配新状态之前可能会尝试的任何清理都会找到合理的值来操作 - 例如,指针设置为nullptr
所以delete
是安全的。
请注意,您调用的其他函数的任何异常都允许导致构造函数退出(即未捕获和抑制)将阻止该对象存在 - 与直接从构造函数抛出的异常相同。