我认为您缺少的是 和 之间的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
}