如果我们有:
public:
MyClass(const std::string& my_str);
private:
std::string _myStr
在实施中:
MyClass::MyClass(const std::string& my_str):
_mystr(my_str)
对比
MyClass::MyClass(const std::string& my_str){
_mystr = my_str
}
为什么第一个版本比第二个更受欢迎?
回答1
为什么第一个版本比第二个更受欢迎?
第一个版本初始化数据成员,而第二个版本分配一个 value 给它。
第二个版本有一个开销,因为在第二种情况下,数据成员 _mystr
将首先在进入构造函数的主体之前被默认初始化,然后在 ctor 的主体内它将被分配一个 value(使用 _mystr = my_str
)。因此,在第二种情况下,涉及两个步骤:
_mystr
将在输入 ctor 的主体之前默认初始化。接下来,在 ctor 的主体内部,将发生赋值
_mystr = my_str
。
请注意,初始化和赋值在 C++ 中是不同的东西。
版本 1
//-------------------------------------------vvvvvvvvvvvvv--->INITIALIZATION of data member myStr
MyClass::MyClass(const std::string& my_str): myStr(my_str)
{
//no ASSIGNMENT happening here
}
版本 2
MyClass::MyClass(const std::string& my_str)//before the body of this ctor is entered, myStr will be default initialized
{
myStr = my_str; //ASSIGNMENT happening here
}
回答2
使用复制构造函数可以更清楚地表达您的意图。如果您改为进行赋值(在构造函数的主体中,而不是在初始化列表中),您将初始化该成员两次,一次是默认的 value,最后是您希望它拥有的 value。
对于一些成员,比如引用,你真的别无选择。