2

私はクラスを書いていますが、この疑問が浮かびました。これは undef ですか。行動?一方、それが推奨されているのか、それとも良い習慣なのかはわかりません。init 関数で例外がスローされないようにする場合は 1 ですか?

//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;
}

前もって感謝します

4

3 に答える 3

6

全然大丈夫です。コンストラクターの本体に入ると、すべてのメンバーが初期化され、使用できるようになります。(本体は、完全に構築されたオブジェクトを作成するために必要な作業を完了します。)

でもスタイルが悪い。より良いのは次のとおりです。

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

そして、すべての混乱を取り除きます。


例外は安全性とは関係なく、コンストラクターは自由にスローできます。実際、オブジェクトを正常に構築できない場合は、例外をスローすることをお勧めします。

于 2010-04-15T04:19:11.460 に答える
0

これがあなたを噛むかもしれない1つの特定のケースを考えることができます。Cが基本クラスであることが意図されている場合、Cへの参照を非メンバー関数にエスケープできるようにすると、驚く可能性があります。基本クラスの場合、コンストラクターはより特別です。これは、派生クラスがまだ構築されておらず、仮想関数が派生クラスではなく基本クラスを呼び出すためです。非メンバー関数は、この状態のオブジェクトを取得することを期待していない可能性があり、コンストラクターのようには見えないため、それを忘れることでバグを簡単に導入できます。

それでも未定義の動作ではありません-驚くべき定義済みの動作です:)

于 2010-04-15T05:46:16.620 に答える
0

コントロールがコンストラクターに到達するまでに、すべての変数はデフォルト値を取得しています。

于 2010-04-15T04:28:02.490 に答える