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

时间:2012-02-08 20:23:27

标签: 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) { };

本书说成员初始化程序如birthDate(dateOfBirth)调用了Date类的复制构造函数。我很困惑为什么复制构造函数?我认为“通过引用传递”的全部意义是避免对象复制?

如果我这样做:

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

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

4 个答案:

答案 0 :(得分: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, /* ..... */);
}
  1. 我们调用Employee::Employee,将fname传递给const&无副本)。
  2. 构造函数从第一个参数
  3. 初始化它的成员firstname
  4. 此练习std::string(const std::string&),再次通过const&传递参数(仍然没有副本)。
  5. std::string复制构造函数现在采取所有必要步骤将其值的参数复制到对象本身。 这是副本
  6. 当你构造一个新的std::string(在这种情况下作为Employee的成员)时,它会产生一个...... new std::string。我认为,用这种方式思考它很容易掌握。

答案 1 :(得分:4)

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

答案 2 :(得分:4)

这两行将调用Date的复制构造函数:

 birthDate(dateOfBirth),
 hireDate(dateOfHire)

答案 3 :(得分:2)

“通过引用传递”的意思是,只要调用Employee构造函数,就不会复制,但只有当您选择初始化一个Employee的成员且传递了Date时。