因此,c++ 为类生成了一个自动复制 ctor。当类包含指针时会发生什么?我们刚刚在我的大学进行了测试,令我困惑的是,我们可以复制包含指针的对象,并且指针被拆分。
obj a;
a.push(20);
a.push(100);
obj b = a;
b.pop();
b.push(500);
a 现在 a 包含 20、100 和 b 包含 20,500,即使值 (20,100,500) 使用指针存储在链表中。这怎么可能?
因此,c++ 为类生成了一个自动复制 ctor。当类包含指针时会发生什么?我们刚刚在我的大学进行了测试,令我困惑的是,我们可以复制包含指针的对象,并且指针被拆分。
obj a;
a.push(20);
a.push(100);
obj b = a;
b.pop();
b.push(500);
a 现在 a 包含 20、100 和 b 包含 20,500,即使值 (20,100,500) 使用指针存储在链表中。这怎么可能?
指针是简单的可复制值,这就是类的隐式复制构造函数处理它们的方式。这有时被称为“浅”副本,因为它不复制所指向的对象。
如果您想将“所有权”语义附加到指针,那么您必须自己完成,为包含它的类编写自己的复制/移动操作,或者使用现有的智能指针类为您完成。
例如,在这种情况下,您可以使用unique_ptr
防止将节点从一个列表复制到另一个列表(同时允许将它们移入和移出列表);或者您可以编写自己的复制构造函数和赋值运算符来复制指向的节点,而不仅仅是指针,以获得“深度”复制语义。
这取决于您的基础类。如果 obj 是从具有复制构造函数的东西派生的(它看起来像 std 堆栈类或其他东西),那么这个会做一个很好的副本。我们可能需要查看整个代码以及 push/pop 的来源。