引数を基本クラスのコンストラクタに渡す違いは何ですか?C++の基本クラスコンストラクタへの引数の受け渡しの違い
Dog::Dog(string input_name, int input_age) : Pet(input_name, input_age) { }
Dog::Dog(string input_name, int input_age) { Pet(input_name, input_age); }
引数を基本クラスのコンストラクタに渡す違いは何ですか?C++の基本クラスコンストラクタへの引数の受け渡しの違い
Dog::Dog(string input_name, int input_age) : Pet(input_name, input_age) { }
Dog::Dog(string input_name, int input_age) { Pet(input_name, input_age); }
Pet
にはデフォルトコンストラクタを持っていない場合は、唯一の1)が動作します。 コンストラクタの実際の本体に入るときには、すべてのメンバーとベースが既に構築されています。したがって、基本クラスにデフォルトのコンストラクタがない場合は、コンパイラにどのコンストラクタを初期化するかを指示し、コンストラクタの本体の前で行う必要があります。これが初期化子リストの目的です。
もう1つの理由は、ベースまたはメンバがconst
の場合です。コンストラクタの本体で変更することはできません。
は、次のコードを見て: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"};
};
一つは、親クラスのコンストラクタを呼び出します。もう1つは一時的なペットオブジェクトを生成します。このオブジェクトはすぐに破棄されて破壊されます(少なくとも、セミコロンがない場合は実際にビルドされます)。 –