我正在上课,这个疑问出现了。这是不是吗?行为?另一方面,我不确定它的推荐,或者它是一个好的做法。如果我确保在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;
}
提前致谢
答案 0 :(得分:6)
完全没问题。一旦输入构造函数的主体,所有成员都已初始化并且可以使用它们。 (然后,正文将完成为创建完全构造的对象而需要完成的任何工作。)
但风格很差。更好的只是:
C::C() :
vx(), vy() // or vx(0), vy(0) if you prefer to be explicit
{}
摒弃所有混乱。
例外与安全无关,构造者可以自由抛出。实际上,如果您无法成功构造对象,则抛出异常是首选的操作过程。
答案 1 :(得分:0)
当控件到达构造函数时,所有变量都将具有默认值。
答案 2 :(得分:0)
我可以想到一个可能会咬你的具体案例。如果C旨在成为基类,则允许对它的引用转义为非成员函数可能会导致意外。在基类中,构造函数更加特殊,因为尚未构造派生类,虚函数调用基类而不是派生类。非成员函数可能不期望在这种状态下获取对象,并且因为它们看起来不像构造函数,所以通过忘记它来引入错误很容易。
它仍然不是未定义的行为 - 只是令人惊讶的定义行为:)