c ++:复制ctor和指针

Posted

技术标签:

【中文标题】c ++:复制ctor和指针【英文标题】:c++: Copy ctor and pointers 【发布时间】:2013-05-27 13:13:31 【问题描述】:

因此,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) 使用指针存储在链表中。这怎么可能?

【问题讨论】:

这将产生一个浅拷贝。默认复制构造函数按值复制指针。所以你有两个指针指向同一个内存。 这是可能的,因为通过查看函数名称,它似乎是一个堆栈实现。你推了 20 然后 100 然后将 a 分配给 b 然后你做了一个 pop 意味着你删除了 100 并且你在 b 中推了 500 所以值应该是你所说的。 是的,类成员被复制,如果这些类成员是指针,则意味着指针被复制。 否则它应该如何工作?! 你能说明obj的定义吗? 显然 obj 有一个用户定义的复制 ctor 来复制值 【参考方案1】:

指针是简单的可复制值,这就是类的隐式复制构造函数处理它们的方式。这有时被称为“浅”副本,因为它不会复制指向的对象。

如果您想将“所有权”语义附加到指针,那么您必须自己执行此操作,方法是为包含它的类编写自己的复制/移动操作,或者使用现有的智能指针类来执行此操作你。

例如,在这种情况下,您可以使用unique_ptr 来防止节点从一个列表复制到另一个列表(同时允许将它们移入和移出列表);或者您可以编写自己的复制构造函数和赋值运算符来复制指向的节点,而不仅仅是指针,以获得“深度”复制语义。

【讨论】:

【参考方案2】:

这取决于您的基础类。如果 obj 是从具有复制构造函数的东西派生的(它看起来像 std 堆栈类或其他东西),那么这个会做一个很好的副本。我们可能需要查看整个代码以及 push/pop 的来源。

【讨论】:

以上是关于c ++:复制ctor和指针的主要内容,如果未能解决你的问题,请参考以下文章

c ++:原始指针映射中的复制,删除和运算符=

C和指针 第九章 习题

C ++中的变量和引用有啥区别? [复制]

简述C语言标准库函数strcpy功能和格式?

在没有指针的情况下复制 C 字符串中的单个字符

C++中,啥是深拷贝?啥是浅拷贝?