2017-10-03 9 views
-2

引数を基本クラスのコンストラクタに渡す違いは何ですか?C++の基本クラスコンストラクタへの引数の受け渡しの違い

  1. Dog::Dog(string input_name, int input_age) : Pet(input_name, input_age) { }
  2. Dog::Dog(string input_name, int input_age) { Pet(input_name, input_age); }
+4

一つは、親クラスのコンストラクタを呼び出します。もう1つは一時的なペットオブジェクトを生成します。このオブジェクトはすぐに破棄されて破壊されます(少なくとも、セミコロンがない場合は実際にビルドされます)。 –

答えて

0

Petにはデフォルトコンストラクタを持っていない場合は、唯一の1)が動作します。 コンストラクタの実際の本体に入るときには、すべてのメンバーとベースが既に構築されています。したがって、基本クラスにデフォルトのコンストラクタがない場合は、コンパイラにどのコンストラクタを初期化するかを指示し、コンストラクタの本体の前で行う必要があります。これが初期化子リストの目的です。

もう1つの理由は、ベースまたはメンバがconstの場合です。コンストラクタの本体で変更することはできません。

1

は、次のコードを見て:m_legsはコンストラクタの本体の前を初期化されているので、この上記のスニペットで

class Cat { 
private: 
    const int m_legs; 

public: 
    Cat() : m_legs{4} 
    { 
    } 
}; 

あなたは定数を初期化する必要が唯一の方法です。

別のケースがexeptions経営管理論です:

class Test { 
private: 
    ICanThrow m_throw; 

public: 
    Cat() try : m_throw{} 
    { 
    } 
    catch(...) 
    { 
     // mangage exception 
    } 
}; 

私は通常CTOR本体の前にメンバーを初期化するか、私はクラス宣言で直接メンバーを初期化することができるとき好む:

class Cat { 
public: 
    void meow() 
    { 
    } 

private: 
    const int m_legs = 4; 
    string m_meow{"meow"}; 
}; 
関連する問題