【发布时间】:2011-06-19 20:26:54
【问题描述】:
Herb Sutter 在他的一篇http://www.gotw.ca 文章中提到,只有在构造函数执行完成时才构造对象(具有有效存在)。即以粗略的方式将控制传递到其最后一个括号之外。
现在考虑下面的代码
class A
{
public:
A()
{
f();
}
void f()
{
cout << "hello, world";
}
};
int main()
{
A a;
}
现在根据 Herb 的说法,我们不能说因为 A 没有在其构造函数中完全构造,因此在构造函数中调用 f() 是无效的,因为“this”ptr 还没有准备好。
在构造函数中确实有一个有效的“this”并且 f() 确实被调用了。
我不认为 Herb 说了什么不正确的东西……但我猜我的解释不正确……有人可以向我解释一下这到底是什么吗?
这里是文章的链接: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 not now exist, but never existed.
【问题讨论】:
标签: c++ object constructor