assignment
とinitialization
の違いは何ですか?
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
}
代入演算子と何が関係していますか?オブジェクトはコンストラクタでのみ初期化できます。代入演算子が呼び出された場合は、すでにオブジェクトインスタンスがあるためです。 – ildjarn
@ildjarn正直言って、私はイニシャライザのリストが新です。私の理論的根拠は、コンストラクタ(代入)の本体で 'm_myString = myString; 'を置き換えるため、初期化子リストに*のソート*が割り当てられているということでした。 – MPelletier
これは、コンストラクタの初期化リストから 'm_myString(myString)'を省略すると、暗黙的に 'm_myString()'になります( 'std :: string'には些細でないコンストラクタがあるので)。デフォルトで構築されたオブジェクトです。 : - ] – ildjarn