在 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 许可协议
涉及副本的不是传递模式。
是成员的初始化涉及到副本(显然?参数不在类中,类成员需要获取相同的值:副本)
让我们检查一下
Employee::Employee
,通过fname
传递 ---const&
( _无副本_)。std::string(const std::string&)
,再次通过const&
传递参数(仍然没有副本)。std::string
复制构造函数现在采取所有必要的步骤将其参数的值复制到对象本身中。 这是副本有意义的是,当您构造一个新的
std::string
(在这种情况下作为 Employee 的成员)时,它会产生一个 … newstd::string
。我想,这样想就很容易掌握了。