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

Oli*_*ver 12 c++

在Deitel C++的书("C++ 11 for Programmers",第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) { };
Run Code Online (Sandbox Code Playgroud)

书中说成员初始化程序,如birthDate(dateOfBirth)调用Date类的复制构造函数.我很困惑为什么复制构造函数?我认为"通过引用传递"的全部要点是避免对象复制?

如果我做:

Date birth(7,24, 1959);
Date hire(2,12, 1988);
Employer staff("bob", "blue", birth, hire);
Run Code Online (Sandbox Code Playgroud)

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

seh*_*ehe 16

它不是涉及副本的传递模式.

这是调用副本的成员的初始化(显然?参数不在类中,并且类成员需要获得相同的值:copy)

我们来看看

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, /* ..... */);
}
Run Code Online (Sandbox Code Playgroud)
  1. 我们调用Employee::Employee,传递fnameconst&(无复印件).
  2. 构造函数从第一个参数初始化它的成员firstname
  3. 这个练习std::string(const std::string&),再次传递参数const&(仍然没有副本).
  4. std::string拷贝构造函数现在采取一切必要步骤,以复制的价值它的参数为对象本身.这是副本

有意义的是,当你构造一个新的std::string(在这种情况下作为Employee的成员)时,它会产生一个...... new std::string.我认为,以这种方式思考这一点很容易掌握.


Rha*_*aun 5

“按引用传递”的要点是,不要在调用 Employee 构造函数后立即进行复制,而是仅当您选择使用传递的 Date 来初始化 Employee 的成员之一时才进行复制。

  • 我不确定你的意思,但请放心,我是怀着良好的心情说的:)我个人觉得(也?)遵守正确的术语很无聊,有时也_meh_,但这是建立更深入理解的唯一方法(否则,当调用复制构造函数,或者更确切地说是赋值运算符时,您如何知道_?这是相关的内容,如果您的类包含引用成员,则可能会成为一个障碍。)无论如何,我已经偏离主题了。干杯 (2认同)

Ker*_* SB 5

您的原始对象birth确实是通过引用传递给Employee复制构造函数的,因此在该阶段不会进行复制。但是,在Employee构造副本时,成员 Employee::birthDate对象使用自己的复制构造函数进行初始化,外部birth对象通过引用传递给该构造函数,但是该复制构造函数当然会复制该birth对象,从而成为Employee::birthDate成员对象.