拷贝相关


每日一记

本篇文章简要记录一下C++拷贝相关的知识以及误区。

首先上定义:
拷贝和浅拷贝是指在对对象一份复制或者复制某些部分时所表现出来的差异。

浅拷贝只复制对象的引用,由于是引用,所以当拷贝对象中的属性变化时,原始对象和拷贝对象共享这些属性的变化,也就是说,拷贝对象的属性变化会影响到原始对象的属性。因为是浅拷贝,所以拷贝的对象和原来的对象不是两个的独立存在,而是共享数据存储空间。

深拷贝则是在复制对象的指针引用的同时,完全复制一份内容相同的对象。也就是说,深度拷贝会创建一个新的对象,而不仅仅是拷贝其指针引用,因此,它们的变化互不影响。人们可以自由操作两个对象,而不会对另一个产生影响。因此,深拷贝能够完整地承载原对象所有信息。这个复制后的对象与原对象彻底分离,内存空间也不同了。

简单地说:浅拷贝会影响原有的数据,相当于做了路径引用;深拷贝是另外开辟了内存空间,相当于复制了一个。

然后是一个比较大的误区(可能是我比较菜所以搞不懂):
使用指针传递值是浅拷贝。

当使用指针传递值时,函数参数传递的是指针所指向的内存地址,而不是实际的变量本身。因此,函数内部对于指针所指向的数据进行的操作,会直接影响到原始数据,属于浅拷贝。

如果需要进行深拷贝,可以使用其他方式,比如使用引用传递或者复制构造函数等。

上代码才看得懂!

指针可以直接访问和修改原数据的地址,从而实现更改原数据。具体操作步骤如下:

1. 定义指针变量并初始化为原数据的地址:

int data = 10;
int* pData = &data;

2. 通过指针访问和修改原数据:

*pData = 20;  // 将原数据修改为20

完整示例代码如下:

#include 
using namespace std;

int main() {
    int data = 10;
    int* pData = &data;

    cout << "原数据:" << data << endl;
    *pData = 20;
    cout << "更改后的数据:" << data << endl;

    return 0;
}

输出结果为:
原数据:10
更改后的数据:20

今天就这么多,写作业去了。


评论
  目录