初期化リストを使用する利点について私が知っていることは、組み込みではないクラスメンバーを初期化するときに効率が上がることです。例えば、
Fred::Fred() : x_(whatever) { }
よりも好ましい
Fred::Fred() { x_ = whatever; }
x がカスタム クラスのオブジェクトの場合。それ以外は、一貫性を保つために組み込み型でもこのスタイルが使用されます。
これを行うことの最も一般的な利点は、パフォーマンスの向上です。式whateverがメンバー変数x_と同じ型である場合、whatever式の結果はx_内で直接構築されます — コンパイラはオブジェクトの別のコピーを作成しません.
もう 1 つのスタイルでは、別の一時オブジェクトが作成され、この一時オブジェクトが x_ オブジェクトの代入演算子に渡されます。次に、その一時オブジェクトは ; で破棄されます。それは非効率的です。
質問
初期化リストを使用すると、次の例で効率が向上しますか。得はないと思います。最初のバージョンは文字列のコピー コンストラクターを呼び出し、もう一方のバージョンは文字列の代入演算子を呼び出します (作成される一時的なものはありません)。それは正しいですか?
class MyClass
{
public:
MyClass(string n):name(n) { }
private:
string name;
};
class MyClass
{
public:
MyClass(string n)
{
name=n;
}
private:
string name;
};