Herb Sutter在他的一篇http://www.gotw.ca文章中提到,只有当构造函数执行完成时才构造一个对象(具有有效存在性).将它以粗略的方式放置控制超出其最终大括号.
现在考虑以下代码
class A
{
public:
A()
{
f();
}
void f()
{
cout << "hello, world";
}
};
int main()
{
A a;
}
Run Code Online (Sandbox Code Playgroud)
现在从Herb所说的,我们不能说因为A在构造函数中没有完全构造,所以构造函数内部的调用f()是无效的,因为"this"ptr还没有准备好.
在构造函数中确实存在有效的"this",并且f()确实被调用.
我不认为赫伯说的不正确......但我猜我正在解释它......可以解释一下究竟是什么原因吗?
以下是该文章的链接:http://www.gotw.ca/gotw/066.htm 它讨论了构造函数的异常.具体来说,这是我的问题所依据的摘录:
- 对象的生命何时开始? 当其构造函数成功完成并正常返回时.也就是说,控制到达构造函数体的末尾或更早的return语句.
- 对象的生命何时结束?当它的析构函数开始时.也就是说,控制到达析构函数体的开头. 这里重要的一点是,对象在其生命周期开始之前的状态与其生命周期结束之后的状态完全相同 - 没有对象,句点.这一观察将我们带到了关键问题:
我们可以总结一下C++构造函数模型如下:
Either:
(a) The constructor returns normally by reaching its end or a return statement, and the object exists.
Or:
(b) The constructor exits by emitting an exception, and the object not only does …Run Code Online (Sandbox Code Playgroud)