1

代入演算子のオーバーロードがイニシャライザリストに伝播しますか?例えばイニシャライザリストと代入オーバーロード(operator =)

、クラスを考える:

class MyClass { 
    private: 
     std::string m_myString; //std::string overloads operator = 
    public: 
     MyClass(std::string myString); 
} 

そしてコンストラクタ:

MyClass::MyClass(std::string myString) 
: m_myString(myString) 
{ 
} 

初期化子リストはstd::stringに代入演算子のオーバーロードを行う動作しますか?それ以外の場合は回避策がありますか?

特にGCCの場合。

+3

代入演算子と何が関係していますか?オブジェクトはコンストラクタでのみ初期化できます。代入演算子が呼び出された場合は、すでにオブジェクトインスタンスがあるためです。 – ildjarn

+0

@ildjarn正直言って、私はイニシャライザのリストが新です。私の理論的根拠は、コンストラクタ(代入)の本体で 'm_myString = myString; 'を置き換えるため、初期化子リストに*のソート*が割り当てられているということでした。 – MPelletier

+0

これは、コンストラクタの初期化リストから 'm_myString(myString)'を省略すると、暗黙的に 'm_myString()'になります( 'std :: string'には些細でないコンストラクタがあるので)。デフォルトで構築されたオブジェクトです。 : - ] – ildjarn

答えて

2

assignmentinitializationの違いは何ですか?

int a = 10; // Initialization 
a = 1; // Assignment 

上記の例は単純で理解することは困難ではありません。

は、基本的なタイプで、簡単な例を見てみましょう。しかし、ユーザー定義の型に入ると、オブジェクトがであるため、単純ではありません。

例えば、ここで重要なことは、operator=は異なる文脈で異なるものを意味しているstd::string

std::string s1("String1"); // Initialization (constructs s1 using constructor) 
std::string s2 = s1; // Initialization (constructs s2 using copy constructor) 
std::string s3(s2); // Initialization (constructs s3 using copy constructor) 

s1 = s2; // Assigns s2 to s1 using assignment operator 

を見てみましょう。それはすべての左側にあるに依存します。

std::string s1 = "Hello"; // Lhs has std::string s1, so this is initialization 
    s1 = "Bob"; // Lhs has only s1, so this is assignment 

そして、初期化子リストが初期化のみ(したがって、その名前初期化子リスト)を行います。

MyClass::MyClass(std::string myString) 
: m_myString(myString) // Initialization 
{ 
} 

ちょうどあなたがコンストラクタの本体でoperator=を呼び出すとき、あなたは今、初期化割り当てをやっていないが、注意してください。

MyClass::MyClass(std::string myString) 
{ 
    // m_myString(myString); <-- Error: trying to call like a function 
    m_myString = myString; // Okay, but this is assignment not initialization 
} 
3

私は代入演算子ではなくコピーコンストラクタを使用すると考えています。

2
MyClass::MyClass(std::string myString) 
: m_myString(myString) 
{ 
} 

あなたはここに2つのコピーを持っている注:パラメータmyString、およびメンバーm_myStringを初期化するための1を初期化する1。あなたはそれを望んでいません。 C++ 03では、あなたはconst参照によってパラメータを取る:

MyClass::MyClass(const std::string& myString) 
: m_myString(myString) 
{ 
} 

そして、C++ 11で、あなたは値によってパラメータを取るだろうし、手動でメンバーに移動:

MyClass::MyClass(std::string myString) 
: m_myString(std::move(myString)) 
{ 
} 
関連する問題