深、浅拷贝定义:
深拷贝和浅拷贝在程序中较为重要。
深拷贝类似于文件下载、U盘文件拷贝,是在存储介质上开辟一块新的存储区域来存放目标数据。
浅拷贝就如同windows中的快捷方式一样,仅仅是一个指向性的文件,并没有实质性的数据内容。
深、浅拷贝还可以依据内存中的资源重新分配来划分:深拷贝是在程序运行过程中,重新为即将写入的数据划分新的、等大的存储区域,而浅拷贝仅仅为原有数据建立映像(C语言中多为指针),并不会复制具体的数据。
附图:
深拷贝
深拷贝之于内存资源分配:
深拷贝在程序运行过程中,不仅仅是在堆区拷贝数据,还会在栈区拷贝数据,只要是将原有数据全部“备份”一遍,都可以理解为深拷贝。同样的C++代码,有如下三种书写方式,到底哪一种才算是深拷贝?
以下有三个C++代码,通过定义类的有参构造来比较各代码的区别:
例程1:(仅作测试用)
#include<iostream>
using namespace std;
#define size 20
//栈区分配内存资源
class demo
{
private:
int len;
int data[size];
public:
demo(int *src, int max)//有参构造
{
if (max < size)
{
for (int i = 0; i < max; i++)
data[i] = *(src + i);
len = max;
}
else
cout << "指定存储空间过小" << endl;
}
};
例程2:(仅作测试用)
#include<iostream>
using namespace std;
//指针指向修改
class demo1
{
private:
int len;
int *data;
public:
demo1(int *src, int max)//有参构造
{
data = src;
len = max;
}
};
例程3:(仅作测试用)
#include<iostream>
using namespace std;
//堆区分配资源
class demo2
{
private:
int len;
int *data;
public:
demo2(int *src, int max)//有参构造
{
data = new int[max];
for (int i = 0; i < max; i++)
{
*(data + i) = *(src + i);
}
len = max;
}
};
例程1通过在栈区(也就是程序运行的数据段)分配空间进行数据拷贝;例程2是通过修改指针指向来实现后续数据的访问;例程3则利用了new(等价于C的malloc)在堆区申请内存空间来完成数据拷贝。
通过以上三个例程,说明深浅拷贝不能只局限于内存资源分配区段(是栈区还是堆区)来区分,而应当通过其操作方式即实质来区分!