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