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

时间:2010-04-15 04:17:04

标签: 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;
}

提前致谢

3 个答案:

答案 0 :(得分:6)

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

但风格很差。更好的只是:

C::C() :
vx(), vy() // or vx(0), vy(0) if you prefer to be explicit
{}

摒弃所有混乱。


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

答案 1 :(得分:0)

当控件到达构造函数时,所有变量都将具有默认值。

答案 2 :(得分:0)

我可以想到一个可能会咬你的具体案例。如果C旨在成为基类,则允许对它的引用转义为非成员函数可能会导致意外。在基类中,构造函数更加特殊,因为尚未构造派生类,虚函数调用基类而不是派生类。非成员函数可能不期望在这种状态下获取对象,并且因为它们看起来不像构造函数,所以通过忘记它来引入错误很容易。

它仍然不是未定义的行为 - 只是令人惊讶的定义行为:)