Я думаю, что вам не хватает разницы между 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
И списки инициализаторов выполняют только инициализацию (отсюда и название initializer list).
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
}