关于c++:深拷贝与浅拷贝到底是什么

37次阅读

共计 1607 个字符,预计需要花费 5 分钟才能阅读完成。

深复制也叫深拷贝;

浅拷贝和深拷贝

拷贝就是复制,创立正本。假如有对象 A,A 有属性 t1,t2。那么,我通过拷贝 A,失去 B,B 应该也有属性 t1,t2,且 A、B 两个对象的每个属性,都应该是雷同的。

对于根本类型的属性 t1,拷贝是没有疑义的。简略将值复制一份,就达到了拷贝的成果。而对于援用类型的属性 t2 来说,拷贝就有了两层含意。

第一层是,我只是将 t2 援用的地址复制一份给 B 的 t2,的确达到了属性雷同的成果,能够了解为实现了拷贝,然而事实上,两个对象中的属性 t2 对应的是同一个对象。在 B 对象上对 t2 所指向的对象进行操作,就会影响到 A 对象中的 t2 的值。

第二层是,我将 A 的 t2 所指向的对象,假如为 o1,残缺复制一份,假如为 o2,将新的 o2 的地址给 B 的 t2。也达到了复制的成果,且对 B 的 t2 所指向的 o2 进行操作,不会影响到 A 的 t2 所指向的 o1。

拷贝的两层含意,对应了浅拷贝和深拷贝的概念,做了第一层,就是浅拷贝,做到第二层,就是深拷贝。

基于以上内容,很容易能够想到,浅拷贝比深拷贝要更快,然而,从拷贝的意义上来看,浅拷贝相较于深拷贝,要欠缺一点。

实例如下:

include <iostream>

using namespace std;

//20200430 公众号:C 语言与 CPP 编程

class CopyDemo

{

public:

CopyDemo(int pa,char *cstr) // 构造函数,两个参数

{

this->a = pa;

this->str = new char[1024]; // 指针数组,动静的用 new 在堆上调配存储空间

strcpy(this->str,cstr); // 拷贝过去

}

// 没写,C++ 会主动帮忙写一个复制构造函数,浅拷贝只复制指针, 如下正文局部

//CopyDemo(CopyDemo& obj)

//{

// this->a = obj.a;

// this->str = obj.str; // 这里是浅复制会出问题,要深复制

//}

CopyDemo(CopyDemo& obj) // 个别数据成员有指针要本人写复制构造函数,如下

{

this->a = obj.a;

// this->str = obj.str; // 这里是浅复制会出问题,要深复制

this->str = new char[1024];// 应该这样写

if(str != 0)

strcpy(this->str,obj.str); // 如果胜利,把内容复制过去

}

~CopyDemo() // 析构函数

{

delete str;

}

public:

int a; // 定义一个整型的数据成员

char *str; // 字符串指针

};

int main()

{

CopyDemo A(100,”hello!!!”);

CopyDemo B = A; // 复制构造函数,把 A 的 10 和 hello!!! 复制给 B

cout <<“A:”<< A.a << “,” <<A.str << endl;

// 输入 A:100,hello!!!

cout <<“B:”<< B.a << “,” <<B.str << endl;

// 输入 B:100,hello!!!

// 批改后, 发现 A,B 都被扭转,起因就是浅复制,A,B 指针指向同一中央,批改后都扭转

B.a = 80;

B.str[0] = ‘k’;

cout <<“A:”<< A.a << “,” <<A.str << endl;

// 输入 A:100,kello!!!

cout <<“B:”<< B.a << “,” <<B.str << endl;

// 输入 B:80,kello!!!

return 0;

}

依据下面实例能够看到,浅复制仅复制对象自身(其中包含是指针的成员),这样不同被复制对象的成员中的对应非空指针会指向同一对象,被成员指针援用的对象成为共享的,无奈间接通过指针成员平安地删除(因为若间接删除,另外对象中的指针就会有效,造成所谓的野指针,而拜访有效指针是危险的;除非这些指针有援用计数或者其它伎俩确保被指对象的所有权);而深复制在浅复制的根底上,连同指针指向的对象也一起复制,代价比拟高,然而绝对容易治理。

正文完
 0