gpt4 book ai didi

c++ - 运算符重载 = 修改原始对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:12 25 4
gpt4 key购买 nike

struct List {
int size;
int* items;
List& operator=(const List& l);
};

List& List::operator=(const List& l)
{
delete[] items;
size = l.size;
items = new int[20];

for (int i = 0; i < size; i++)
items[i] = l.items[i];

return *this;
}

ostream& operator<<(ostream& out, const List& l)
{
out << "Size: " << l.size << "\t {";
for (int i = 0; i < l.size; i++)
out << l.items[i] << " ";

return (out << "}");
}

int main()
{
int size = 6;
List l1 = { size, new int[size]{ 0, 1, 2, 3, 4, 5 } };
List l2 = l1;

l2.items[1] = 50;

cout << l1 << endl;
cout << l2 << endl;

return 0;
}

我很困惑,因为当我使用重载运算符分配 l2 = l1 时,为什么稍后更改 l2 时 l1 的内容会发生变化?特别是因为 l1 作为常量传递。它们以某种方式指向内存中的同一个对象,而不是拷贝。

最佳答案

List l2 = l1; 不调用复制赋值运算符 (operator=(const List& l))。由于“赋值”发生在变量声明期间,因此您通过复制初始化来初始化 l2,这会调用编译器生成的默认复制构造函数。由于它执行浅拷贝,因此两个对象将指向相同的数据。

如果您要编写自己的类来管理内存/资源,您至少需要提供自己的复制构造函数、复制赋值运算符和析构函数。这被称为 the rule of three .如果你想包含移动语义,那么你需要提供移动构造函数和移动赋值运算符,这被称为 5 规则。还有零规则,其中使用已经“做正确的事”的类型(就像使用 std::vector) 允许编译器生成的默认值为你工作,你可以在 The rule of three/five/zero 阅读所有内容

关于c++ - 运算符重载 = 修改原始对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53856164/

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