あなたが見逃しているのは と の違いだと思いassignment
ますinitialization
。
基本型の簡単な例を見てみましょう。
int a = 10; // Initialization
a = 1; // Assignment
上記の例は単純で、理解するのは難しくありません。ただし、ユーザー定義型に入ると、オブジェクトが構築されるため、それほど単純ではありません。
たとえば、見てみましょう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
ここで重要なのは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
}