c++ - 为什么初始化类的成员变量时,复制构造函数优于赋值运算符?

如果我们有:

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)。因此,在第二种情况下,涉及两个步骤:

  1. _mystr 将在输入 ctor 的主体之前默认初始化。

  2. 接下来,在 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
}

另外,请查看https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier

回答2

使用复制构造函数可以更清楚地表达您的意图。如果您改为进行赋值(在构造函数的主体中,而不是在初始化列表中),您将初始化该成员两次,一次是默认的 value,最后是您希望它拥有的 value。

对于一些成员,比如引用,你真的别无选择。

相似文章

最新文章