在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)
Employee::Employee,传递fname的const&(无复印件).std::string(const std::string&),再次传递参数const&(仍然没有副本).std::string拷贝构造函数现在采取一切必要步骤,以复制的价值它的参数为对象本身.这是副本有意义的是,当你构造一个新的std::string(在这种情况下作为Employee的成员)时,它会产生一个...... new std::string.我认为,以这种方式思考这一点很容易掌握.
“按引用传递”的要点是,不要在调用 Employee 构造函数后立即进行复制,而是仅当您选择使用传递的 Date 来初始化 Employee 的成员之一时才进行复制。
您的原始对象birth确实是通过引用传递给Employee复制构造函数的,因此在该阶段不会进行复制。但是,在Employee构造副本时,成员 Employee::birthDate对象使用自己的复制构造函数进行初始化,外部birth对象通过引用传递给该构造函数,但是该复制构造函数当然会复制该birth对象,从而成为Employee::birthDate成员对象.