为什么引用传递涉及复制构造函数?

新手上路,请多包涵

在 Deitel C++ book (“C++11 for Programmers”, p.286) 中,有一个例子:

 class Date { ... }

class Employee {
public:
   Employee(const string &, const string &, const Date &, const Date &);
private:
    string firstName;
    string lastName;
    const Date birthDate;
    const Date hireDate;
}

Employee::Employee( const string &first, const string &last,
   const Date &dateOfBirth, const Data &dateOfHire)
   : firstName( first),
     lastName( last),
     birthDate(dateOfBirth),
     hireDate(dateOfHire) { };

书中说成员初始化器,如 birthDate(dateOfBirth) 调用 Date 类的复制构造函数。我很困惑为什么要复制构造函数?我认为“按引用传递”的全部意义在于避免对象复制?

如果我做:

 Date birth(7,24, 1959);
Date hire(2,12, 1988);
Employer staff("bob", "blue", birth, hire);

系统现在有多少个 Date 对象,2 个还是 4 个? (一开始创建了两个,复制构造函数创建了两个)

原文由 Oliver 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 570
1 个回答

涉及副本的不是传递模式。

是成员的初始化涉及到副本(显然?参数不在类中,类成员需要获取相同的值:副本)

让我们检查一下

Employee::Employee( const string &first, const string &last,
   const Date &dateOfBirth, const Data &dateOfHire)
   : firstName( first),
     lastName( last),
     birthDate(dateOfBirth),
     hireDate(dateOfHire) { };

int main()
{
    const std::string fname = "test";
    Employee e(fname, /* ..... */);
}

  1. 我们调用 Employee::Employee ,通过 fname 传递 --- const& ( _无副本_)。
  2. 构造函数从第一个参数初始化它的成员名字
  3. 这个练习 std::string(const std::string&) ,再次通过 const& 传递参数(仍然没有副本)。
  4. std::string 复制构造函数现在采取所有必要的步骤将其参数的值复制到对象本身中。 这是副本

有意义的是,当您构造一个新的 std::string (在这种情况下作为 Employee 的成员)时,它会产生一个 … new std::string 。我想,这样想就很容易掌握了。

原文由 sehe 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏