在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? (两个在开始时创建,两个由复制构造函数创建)
答案 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, /* ..... */);
}
Employee::Employee
,将fname
传递给const&
(无副本)。std::string(const std::string&)
,再次通过const&
传递参数(仍然没有副本)。std::string
复制构造函数现在采取所有必要步骤将其值的参数复制到对象本身。 这是副本 当你构造一个新的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时。