复制构造函数中的指针赋值

Posted

技术标签:

【中文标题】复制构造函数中的指针赋值【英文标题】:Pointer assignments in a copy constructor 【发布时间】:2017-07-09 10:30:25 【问题描述】:

我正在使用 Avinash C. KAK 撰写的对象编程一书,在第 452 页中,它说将复制构造函数方法构造为

class X
int * ptr;
int size;
public:
X(const X & xobj)

    size = xobj.size;
    ptr = new int [size];
    for(int i = 0; i < size; i++)
    
        ptr[i] = xobj.ptr[i];
       


然后它用作

X x1;
X x2 = x1;

但是我不明白的是,它先是给x2.ptr分配内存,然后再把x1.ptr的内存地址分配给x2.ptr,这和有拷贝构造方法的目的和新分配的有矛盾内存现在根本没有被使用,所以我错过了什么?

【问题讨论】:

为什么觉得内存没有用?从ptrptr没有赋值,只有内容被复制 但是我们不应该使用 as ´´*obj.ptr[i]´ 吗? 不,不应该。这是一个正常的数组访问。 @SamiKuhmonen 所以这样做的方式是正式的和正确的方式吗? 是的。它分配一个新数组并将现有对象的内容复制到其中,因此现在有两个相同的对象彼此污水。 【参考方案1】:

如果你有一个指向新分配的数组的指针,例如:

ptr = new int[size];

那么你可以像数组一样索引它:

ptr[1] = 3; // equivalent to: *(ptr + 1) = 3

因此,由于它是一个复制构造函数,它将xobj.ptr 指向的内存内容复制到ptr 指向的新分配的内存中。

【讨论】:

以上是关于复制构造函数中的指针赋值的主要内容,如果未能解决你的问题,请参考以下文章

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数

拷贝构造函数 和 赋值操作符重载

c++中拷贝构造函数和赋值运算符重载本质上一样么

C++之拷贝构造与拷贝赋值

为对象指针实现复制构造函数和运算符的正确方法是啥

c++ 拷贝构造函数与赋值运算符重载函数的区别是