在构造函数中调用方法

Aru*_*run 21 c++ constructor object

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 not now exist, but never existed.
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 19

现在从Herb所说的,我们不能说因为A在构造函数中没有完全构造,所以构造函数内部的调用f()是无效的,因为"this"ptr还没有准备好.

这只是当它f()是一个virtual方法class A或它的继承层次结构时,你期望f()根据正确的对象运行时解析.简单来说,virtual如果在构造函数中调用该方法,则机制不会启动.

如果f()不是虚函数,那么从构造函数调用它是没有害处的,只要你知道究竟是什么f().程序员通常initialize()从构造函数中调用类方法.

你能给我链接到Herb Sutter的文章吗?

  • 你假设OP没有仔细阅读这篇文章.如果没有看到这篇文章,你不知道它是否能很好地解释这种情况. (4认同)
  • 我不敢,不.我相信你并不是说听起来很苛刻或居高临下 - 但在我看来,这有点儿. (3认同)

Dan*_*ger 8

当程序流进入构造函数时,对象的内存已经分配,this指针确实有效.

Herb的意思是,对象的状态可能没有完全初始化.特别是,如果要构造一个派生自的类A,那么当您仍在A的构造函数中时,将不会调用该类的构造函数.

如果您有虚拟成员函数,这一点很重要,因为如果从A的构造函数中调用,则派生类中的任何虚函数都不会运行.