首页 > 编程语言 >C++中深拷贝和浅拷贝

C++中深拷贝和浅拷贝

时间:2022-09-18 20:55:49浏览次数:104  
标签:堆区 申请 C++ 中深 拷贝 include 构造函数

浅拷贝:简单的赋值拷贝操作

深拷贝:在堆区重新申请空间,进行拷贝操作

 

浅拷贝和深拷贝的问题出现的条件:

1、拷贝构造函数

2、用new关键字在堆区申请空间

 

在拷贝构造函数当中,如果构造函数使用的是new关键字申请堆区空间,这个时候就需要十分注意!!

不能简单的赋值操作浅拷贝,否则两个对象的指针会指向堆区同一块内存区域,会出现堆区内存重复释放的问题。

因此需要进行深拷贝,即在堆区重新申请空间,进行拷贝操作

 

示例:

 1 #include <string>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 class Person {
 7 public:
 8     //无参(默认)构造函数
 9     Person() {
10         cout << "无参构造函数!" << endl;
11     }
12     //有参构造函数
13     Person(int age ,int height) {
14 
15         cout << "有参构造函数!" << endl;
16 
17         m_age = age;
18         m_height = new int(height);
19 
20     }
21     //拷贝构造函数
22     Person(const Person& p) {
23         cout << "拷贝构造函数!" << endl;
24         //如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
25         m_age = p.m_age;
26 //        m_height = new int(*p.m_height);
27         m_height = p.m_height;
28     }
29 
30     //析构函数
31     ~Person() {
32         cout << "析构函数!" << endl;
33         if (m_height != NULL)
34         {
35             delete m_height;
36         }
37 //        delete m_height;
38     }
39 public:
40     int m_age;
41     int* m_height;
42 };
43 
44 void test01()
45 {
46     Person p1(18, 180);
47 
48     Person p2(p1);
49 
50     cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;
51 
52     cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
53 
54     cout << &p1.m_age << endl;
55     cout << &p2.m_age << endl;
56     // 查看p1.m_height和p2.m_height在堆区的内存地址
57     cout << &(*p1.m_height) << endl;
58     cout << &(*p2.m_height) << endl;
59 }
60 
61 int main() {
62 
63     test01();
64 
65 
66     return 0;
67 }

 

总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

标签:堆区,申请,C++,中深,拷贝,include,构造函数
From: https://www.cnblogs.com/henabo/p/16705746.html

相关文章

  • C++ 我的世界皮肤雕像
    #include<iostream>#include<string>#include<windows.h>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intmain(intargc,char**argv){ bool......
  • 深入理解C++的new和delete
    一、C++中的动态内存管理方式C语言中的动态管理方式是用malloc、free函数,它们在C++仍然可以继续使用,但是由于在部分地方略显无能为力,且使用起来比较麻烦,所以C++提出了自己......
  • C++ Unicode字符串
    字符串前面加L表示该字符串是Unicode字符串。_T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,否则字符串不变。因此,VisualC++里边定义字符......
  • 《C++ Primer Plus 学习笔记》目录
    本篇为随笔《C++PrimerPlus学习笔记》的目录第1章预备知识第2章开始学习C++第3章处理数据第4章复合类型第5章循环和表达式第6章分支语句和逻辑运算符第7章......
  • 《C++ 基础知识杂记》目录
    本篇为随笔《C++基础知识杂记》的目录A篇C++指针A.1C++指针与一维数组名A.2C++指针与二维数组名A.3C++一级指针与const关键字A.4C++二级指针与const关......
  • 实践考核c++
    /*people是基类,student和graduate是子类,重载“==”运算符输入2个学生的信息:姓名、编号、身份证号、班级、专业输入1个研究生的信息:姓名、编号、身份证号、班级、专业、导......
  • c++基础入门自学笔记总结2---C++入门(下)
    今天,我们就来进行指针的知识总结。说句题外话,这部分可以说是c和c++重要基础,在初次接触时也感觉有点难度,即使在学后几天了对指针的运用还不是很熟练,但也不必太着急,毕竟学东......
  • 轻量级C++编程环境|快速搭建|Linux篇
    环境组成成分VisualStudioCode(编辑器)g++gdb(编译器与调试器)CMake(项目管理编译工具)安装VSCode拓展c++/c++extensioncmaketool以上请认准微软官方出品创建工程目......
  • 配置绿色免安装版的C/C++、java、python环境,重装系统可以继续使用
    windows系统用一段时间就会变得臃肿,我平均每年都会重装一下系统,因此需要配置免安装的环境,重装系统可以继续使用。 1、C/C++环境安装配置主流都是用minGwin的gcc/g++,最......
  • C++学习笔记-day16
    1、模板......