gpt4 book ai didi

c++ - 为什么引用传递涉及复制构造函数?

转载 作者:IT老高 更新时间:2023-10-28 23:11:19 24 4
gpt4 key购买 nike

在 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 个? (一开始创建了两个,复制构造函数创建了两个)

最佳答案

涉及拷贝的不是传递模式。

是成员的初始化涉及到拷贝(显然?参数不在类中,类成员需要获取相同的值:拷贝)

我们来看看

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,通过 const& 传递 fname(没有复制)。
  2. 构造函数从第一个参数初始化它的成员名字
  3. 这练习 std::string(const std::string&),再次通过 const& 传递参数(仍然没有复制)。
  4. std::string 复制构造函数现在采取所有必要步骤将其参数的值复制到对象本身。 这是拷贝

有意义的是,当您构造一个新的 std::string(在这种情况下作为 Employee 的成员)时,它会产生一个 ... new std::string。我觉得这样想就很容易掌握了。

关于c++ - 为什么引用传递涉及复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9200827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com