在构造之前,在实例上调用非成员函数

Tom*_*Tom 2 c++ init undefined-behavior

我正在上课,这个疑问出现了.这是不是吗?行为?另一方面,我不确定它的推荐,或者它是一个好的做法.如果我确保在init函数中没有抛出异常,那么它是一个吗?

//c.h
class C{

    float vx,vy;
    friend void init(C& c);
public:
    C();

};


//c.cpp
C::C()
{
   init(*this);
}

void init(C& c) //throws() to ensure no exceptions ?
{
  c.vx = 0;
  c.vy = 0;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

GMa*_*ckG 6

这完全没问题.一旦输入构造函数的主体,所有成员都已初始化并且可以使用它们.(然后,正文将完成为创建完全构造的对象而需要完成的任何工作.)

但它的风格很差.更好的是:

C::C() :
vx(), vy() // or vx(0), vy(0) if you prefer to be explicit
{}
Run Code Online (Sandbox Code Playgroud)

并且消除所有混乱.


例外与安全无关,构造者可以自由抛出.实际上,如果您无法成功构造对象,则抛出异常是首选的操作过程.