C++中深浅拷贝的介绍

简介: C++中深浅拷贝的介绍

目录

什么是浅拷贝

new 和delete的使用方法

浅拷贝的实例

什么是深拷贝

小结


什么是浅拷贝

所谓的浅拷贝就是由系统默认的拷贝构造函数对数据成员进行逐一的赋值,通常默认的拷贝构造函数就是可以达到该效果的,但是如果类中有指针类型的数据,那么此时的浅拷贝就会带来错误

下面我们来看一个由于浅拷贝中带有指针数据所引发错误的例子

下面会用到new 和delete的方法我先来讲解一下

new 和delete的使用方法

在c++中,new和delete是用来分配内存和释放内存的两个操作符,正如c中的malloc和free一样。因为malloc、calloc、realloc都是在堆上分配的,堆上分配的空间必须由用户自己来管理,如果不释放,就会造成内存泄漏。而栈上分配的空间是由编译器来管理的,具有函数作用域,出了函数作用域后系统会自动回收,不由用户管理,所以不用用户显式释放空间。

因此,如果你的函数里面声明指针的时候没有用到new来申请内存。就不用delete了。

       

浅拷贝的实例

#include <iostream>
#include <string>
using namespace std; 
class Score {
  private:
    char *name;
    float score;
  public:
    Score(char *name1,float score1);  //创建一个自定义的构造函数
    ~Score();       //首先声明一个析构函数
};
Score::Score(char *name1, float score1) {
  cout << "我是构造函数,现在已执行……" << name1 << endl;
  name = new char[strlen(name1) + 1];
  if(name != 0){
      strcpy(name,name1);
      score = score1;
  }
}
Score::~Score() {
  cout << "对象注销,现在自动执行析构函数了……" << name << endl;
  name[0] = '\0';
  delete[]name;
}
int main() {
  Score score1("周周", 100);
  Score score2 = score1;
  return 0;
}

该程序的输出结果是会报错的,程序开始运行的时候我们就创建score1对象就调用构造函数

用new运算符从内存中动态分配了一块内存,并且name指向这个内存块,因为我们没有定义拷贝构造函数,所以程序就自动将score1的所有数据成员一一赋值给了score2,这就使得这两个对象的数据成员的都是指向同一个内存,但是当第一个对象生命周期结束时,它相应的内存就被释放了,但是第二次对象score2又企图释放同一内存空间,这就导致的同一个内存空间的两次释放,这当然是不允许的,所以必然会引发错误

什么是深拷贝

深拷贝指的就是当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,对象的另开辟一块新的资源,  

小结

深拷贝和浅拷贝的区别就是在对象状态中包含其他对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象则是深拷贝,否则是浅拷贝。浅拷贝只是单单的对另对象赋值,而深拷贝则需另开辟一片空间来存放内容。

相关文章
|
3天前
|
编译器 C++
【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析
【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析
|
2月前
|
编译器 C语言 C++
C++类和对象的细节原理:this指针、构造函数和析构函数、深浅拷贝、运算符重载、初始化列表、类的各种成员和方法
C++类和对象的细节原理:this指针、构造函数和析构函数、深浅拷贝、运算符重载、初始化列表、类的各种成员和方法
36 0
|
3月前
|
算法 Linux C++
【C++入门到精通】C++入门 —— 深浅拷贝函数
是C++中的一个特殊成员函数,用于创建对象的副本。它的作用是通过使用已有对象的属性值来初始化新对象,实现对象的复制操作。通过定义拷贝构造函数,我们可以控制对象的拷贝过程,并确保正确处理含有指针或动态分配内存的类。
28 0
|
4月前
|
编译器 C++ 容器
【C++】STL容器——【深浅拷贝】与【写时拷贝】对比详解(拷贝构造)(10)
【C++】STL容器——【深浅拷贝】与【写时拷贝】对比详解(拷贝构造)(10)
|
6月前
|
编译器 C语言 C++
「C++之STL」关于在模拟实现STL容器中的深浅拷贝问题
「C++之STL」关于在模拟实现STL容器中的深浅拷贝问题
|
编译器 C++
【C++】-- String深浅拷贝详解
【C++】-- String深浅拷贝详解
157 0
【C++】-- String深浅拷贝详解
|
编译器 C++
C++类和对象【2】—— 对象特性(构造函数、析构函数、拷贝构造函数、深浅拷贝、初始化列表、类对象作为成员类、静态成员变量及静态成员函数等。)
C++类和对象【2】—— 对象特性(构造函数、析构函数、拷贝构造函数、深浅拷贝、初始化列表、类对象作为成员类、静态成员变量及静态成员函数等。)
135 0
C++类和对象【2】—— 对象特性(构造函数、析构函数、拷贝构造函数、深浅拷贝、初始化列表、类对象作为成员类、静态成员变量及静态成员函数等。)
【C++要笑着学】深浅拷贝 | string 模拟实现 | 传统写法与现代写法(三)
本章将正式介绍深浅拷贝,在模拟实现 string 的同时带着去理解深浅拷贝。我们模拟实现 string类不是为了造更好的轮子,而是为了去学习它,理解它的本质!你自己造一次,心里会更清楚,也有利于加深对 string 的理解。
64 0
|
存储 C++
【C++要笑着学】深浅拷贝 | string 模拟实现 | 传统写法与现代写法(二)
本章将正式介绍深浅拷贝,在模拟实现 string 的同时带着去理解深浅拷贝。我们模拟实现 string类不是为了造更好的轮子,而是为了去学习它,理解它的本质!你自己造一次,心里会更清楚,也有利于加深对 string 的理解。
112 0
【C++要笑着学】深浅拷贝 | string 模拟实现 | 传统写法与现代写法(二)
|
测试技术 C语言 C++
【C++要笑着学】深浅拷贝 | string 模拟实现 | 传统写法与现代写法(一)
本章将正式介绍深浅拷贝,在模拟实现 string 的同时带着去理解深浅拷贝。我们模拟实现 string类不是为了造更好的轮子,而是为了去学习它,理解它的本质!你自己造一次,心里会更清楚,也有利于加深对 string 的理解。
54 0
【C++要笑着学】深浅拷贝 | string 模拟实现 | 传统写法与现代写法(一)