复制构造函数 C++ 没有正确复制指针

Posted

技术标签:

【中文标题】复制构造函数 C++ 没有正确复制指针【英文标题】:Copy constructor C++ does not copy pointer correctly 【发布时间】:2020-07-02 19:55:08 【问题描述】:

我为我的班级创建了一个复制构造函数。有谁知道为什么l1.ptrl2.ptr 在编译后给我相同的地址?做过很多次了,不知道哪里出错了。

#include<iostream>
#include<string>

using namespace std;

class numb

public:
    int* ptr;
    numb(int = 3);
    numb(const numb&);
    virtual ~numb();
;

numb::numb(int x)

    this->ptr = new int(x);


numb::numb(const numb& l1)

    this->ptr = new int(*(l1.ptr));



numb::~numb()
    


int main()

    numb l1(5), l2;
    l1 = l2;
    cout << l1.ptr << endl;
    cout << l2.ptr << endl;
    system("Pause");
    return 0;

【问题讨论】:

您忘记提供复制赋值运算符(numb&amp; operator=(numb const&amp;),阅读CppCoreGuidelines。 复制结构类似于numb l2 = l1;。使用l2 = l1;,您可以复制 assignment 记住rule of five。您缺少副本分配:operator=() 这只是出于好奇,还是你真的有这样的代码?那为什么是指针呢?您尝试通过使用指向单个int 的指针来解决的实际问题是什么?即使你有数组,为什么要使用指针和手动内存管理而不是std::vector?请了解the rules of three, five and zero。我强烈推荐零规则。 你的意思是l2 = l1,不是l1 = l2,对吧? 【参考方案1】:

在这个sn-p中:

numb l1(5), l2;
l2 = l1;

第二行没有调用复制构造函数。相反,它正在调用复制赋值运算符。由于您尚未定义,因此您会得到一个浅拷贝。

您可以使用复制构造函数,如下所示:

numb l1(5);
numb l2(l1);

或为您的班级定义operator=

numb& operator=(const numb&);  // do a deep copy

【讨论】:

也没有有用的默认构造函数,所以 OP 可能 意味着 l2 = l1 而不是 l1 = l2 @AsteroidsWithWings 哎呀,好消息。已编辑,谢谢。【参考方案2】:

通过不提供赋值运算符,您将获得编译器为您生成的运算符。编译器确实是在“复制指针”(通常称为“浅拷贝”)。

如果您需要复制pointee(通常称为“深拷贝”),那么您必须实现自己的赋值运算符。

【讨论】:

以上是关于复制构造函数 C++ 没有正确复制指针的主要内容,如果未能解决你的问题,请参考以下文章

C++ Boost 序列化、构造函数和数据复制

在具有智能指针的类上正确实现复制构造函数和等于运算符

在 C++ 中通过构造函数复制类

在 C++ 中为具有包含指针的集合的类编写复制构造函数

c++ 隐式复制构造函数是不是复制数组成员变量? [复制]

c++的复制构造函数