gpt4 book ai didi

c++ - 为什么复制构造函数 "chained"不像默认构造函数和析构函数?

转载 作者:IT老高 更新时间:2023-10-28 21:56:35 25 4
gpt4 key购买 nike

为什么不链接复制构造函数(如默认 ctor 或 dtor),以便在调用派生类的复制构造函数之前调用基类的复制构造函数?使用默认构造函数和析构函数,它们分别在从基到派生和派生到基的链中调用。为什么复制构造函数不是这种情况?例如这段代码:

class Base {
public:
Base() : basedata(rand()) { }

Base(const Base& src) : basedata(src.basedata) {
cout << "Base::Base(const Base&)" << endl;
}

void printdata() {
cout << basedata << endl;
}

private:
int basedata;
};

class Derived : public Base {
public:
Derived() { }

Derived(const Derived& d) {
cout << "Derived::Derived(const Derived&)" << endl;
}
};


srand(time(0));


Derived d1; // basedata is initialised to rand() thanks to Base::Base()

d1.printdata(); // prints the random number

Derived d2 = d1; // basedata is initialised to rand() again from Base::Base()
// Derived::Derived(const Derived&) is called but not
// Base::Base(const Base&)

d2.printdata(); // prints a different random number

复制构造函数不会(不能)真正复制对象,因为 Derived::Derived(const Derived&) 无法访问 basedata 以改变它。

我是否缺少关于复制构造函数的一些基本知识,因此我的心智模型不正确,或者这种设计是否有一些神秘(或不神秘)的原因?

最佳答案

The copy constructor doesn't (can't) really make a copy of the object because Derived::Derived(const Derived&) can't access pdata to change it.

当然可以:

Derived(const Derived& d)
: Base(d)
{
cout << "Derived::Derived(const B&)" << endl;
}

如果您没有在初始化列表中指定基类构造函数,则会调用其默认构造函数。如果要调用默认构造函数以外的构造函数,则必须指定要调用的构造函数(以及使用哪些参数)。

至于为什么是这样的:为什么复制构造函数应该与任何其他构造函数不同?作为一个实际问题的例子:

struct Base
{
Base() { }
Base(Base volatile&) { } // (1)
Base(Base const&) { } // (2)
};

struct Derived : Base
{
Derived(Derived&) { }
};

您希望 Derived 复制构造函数调用哪个 Base 复制构造函数?

关于c++ - 为什么复制构造函数 "chained"不像默认构造函数和析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8773048/

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