C++深度思考-引出赋值、浅拷贝与深拷贝

引言

笔者已经使用C++开发有近一年之久了,但是在对对象之间赋值的时候,出现了非常奇怪的现象,同样的数据在进行赋值后,结构却是不同的。灵异事件发生了,把 “=” 赋值,改成memcopy 解决了问题。但是我用了这么久的 “=” 难道失灵了,满脑子的疑惑。闲下来的时候看了看C++书籍,我在浅拷贝与深拷贝中找到了答案。下面就说说他们

赋值、浅拷贝和深拷贝

我们在开发中经常会用到运算符 “=” 符号,他的作用是 赋值。

string str = "123";

Student stu1;
Student stu2=stu1;

...

下面说说他们之间的关系

赋值

是我们的运算符 “=” 等于号
在基础数据类型之间 进行的是 深拷贝
在自定义(对象)之间的赋值 可能是浅拷贝与深拷贝

浅拷贝

发生对象复制时,只是对对像张数据成员进行简单的赋值。

解读

  • 数据成员:类中包括函数成员与数据成员,浅拷贝是对象中所有数据的成员的值的赋值, 对象名1=对象名2;
  • 对象的赋值只对其中的数据成员赋值,而不能对成员函数赋值。赋值的过程是将一个对象的数据成员在存储空间的状态复制给另一个对象的数据成员的存储空间。
  • 类的数据成员中不可包括动态分配的数据,即指针,否则在赋值时(浅拷贝)可能出现严重的后果。
  • 浅拷贝仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅拷贝出来的对象也会相应改变。
  • 浅拷贝只是对指针进行复制,复制完成后,两个指针指向同一个内存空间

深拷贝

在计算机中开辟了一块新的内存地址用于存放复制的对象。

解读

  • 对于深拷贝,针对成员变量存在指针的情况,不仅仅是简单的指针赋值,而是重新分配内存空间。
  • 深拷贝不止对指针进行复制,也对指针指向的内容进行复制,深拷贝后,两个指针指向不同地址的内存空间,但内容相同。
  • 浅拷贝只完成数据成员的赋值,如果还要赋值数据之外的属性就要使用深拷贝。自己编写拷贝构造函数

二者的区别

最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。

  • 文件创建快捷方式是浅拷贝 文件复制文件是深拷贝
  • 浅拷贝的文件被删除快捷方式失效 深拷贝的源文件被删除,备份文件仍有。
  • 浅拷贝实际上是对类成员的引用,深拷贝是对类成员的复制并且重新分配了内存。

猜你喜欢

转载自blog.csdn.net/osean_li/article/details/80213965