文章目录

  • 一、析构函数
  • 二、C++默认生成的函数
  • 三、构造与析构的调用顺序
  • 四、构造函数的浅拷贝
  • 五、构造函数的深拷贝

一、析构函数

1、析构函数的作用
对象消亡时,自动被调用,用来释放对象占用的内存空间。

2、属性特点
(1)名字与类名相同
(2)在前面需要加上"~"
(3)无参数,无返回值(也不能加void)
(4)一个类最多只有一个析构函数
(5)不自定义析构函数C++会生成默认析构函数

二、C++默认生成的函数

在默认情况下,定义一个C++类都会默认生成以下三个函数:

  • 默认构造函数(无参,函数体为空)
  • 默认析构函数(无参,函数体为空)
  • 默认拷贝构造函数(对类中非静态成员进行简单值拷贝)

注意:
若自定义了拷贝构造函数,将不再提供任何构造函数。
若自定义了普通构造函数,将不会提供默认构造函数,但还是会提供默认拷贝构造函数。

三、构造与析构的调用顺序

构造函数是先定义的先调用,而析构函数是先定义的后调用,类似于“栈”存储结构。

class Test
{int id;
public:Test(int i){id = i;}~Test(){cout<<"ID: "<<id<<" 已析构对象内存空间"<<endl;};
};Test t0(0);                        //最先创建的对象,最后释放void Func()
{static Test t1(1);               //创建静态对象,会在整个程序结束时自动释放Test t2(2);             //在Func结束时自动释放cout<<"-----Func-----"<<endl;
}int main()
{Test t3(3);t3 = 10;                         //类型转换构造函数,这里会创建临时对象,将int型转成Test类型对象,在赋值结束后,临时变量销毁cout<<"------主函数开始-------"<<endl;{Test t4(4);                  //花括号代表作用域,不需要等到main方法结束就释放了}Func();                          //进入Func函数cout<<"------主函数结束-------"<<endl;return 0;
}

四、构造函数的浅拷贝

就是构造函数只进行简单的值拷贝。

/*浅拷贝*/
#include <iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;//定义一个类Person
class Person
{private:char *m_name;  //私有成员数据中定义个指针 int m_num;
public:  //共有成员接口 Person()  //普通无参构造函数 {m_name = NULL;  //在构造函数中将指针指向空 m_num = 0;cout << "已调用无参构造..." << endl;}Person(char *name,int num)  //普通有参构造函数 {//为m_name重新申请空间m_name = (char *)calloc(1,strlen(name)+1);  //新空间大小刚好为name的长度 if(m_name == NULL)  //若私有成员指针仍指向空地址,则输出构造失败 {cout<<"构造失败"<<endl;}cout<<"-->已经申请好空间"<<endl;  //否则提示空间申请成功 strcpy(m_name,name);  //将传入有参构造的参数指针赋值给成员指针 m_num = num;  cout<<"已调用有参构造..."<<endl;}~Person()  //定义析构函数 {if(m_name != NULL)  //若成员指针指向空,表示空间已被释放 {cout<<"m_name的空间已被释放"<<endl;free(m_name);  //否则手动释放内存空间 m_name = NULL;}cout<<"析构函数调用结束..."<<endl;}void showPerson(){cout << "m_name = " << m_name << ", m_num = " << m_num << endl;}
};//定义有参构造的接口测试函数
void demo1()
{Person p1("Chung", 42607);  //实例化p1对象,调用有参构造函数 p1.showPerson();  //调用成员函数输出p1的信息 // 浅拷贝Person p2= p1; //调用系统的默认拷贝构造(单纯的值拷贝)
}//定义无参构造的接口测试函数
void demo2()
{Person p3;  //实例化p3对象,调用无参构造函数p3.showPerson();  //输出p3的信息//浅拷贝Person p4= p3;  //简单的值拷贝
}//主函数定义
int main(int argc, char *argv[])
{//demo1();  //测试开始 ,有参构造 demo2();  //无参构造 return 0;
}

(1)测试demo1

(2)测试demo2

只调用到一半就出错结束了。

五、构造函数的深拷贝

就是通过自定义,拷贝构造函数,完成深拷贝动作,能够将数值和地址都拷贝进去。

#include <iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;//定义一个类Person
class Person
{private:char *m_name;  //私有成员数据中定义个指针int m_num;
public:Person()  //普通无参构造函数 {m_name = NULL;  //在构造函数中将指针指向空 m_num = 0;cout << "已调用无参构造..." << endl;}Person(char *name,int num)  //普通有参构造函数 {//为m_name重新申请空间m_name = (char *)calloc(1,strlen(name)+1);  //新空间大小刚好为name的长度 if(m_name == NULL)  //若私有成员指针仍指向空地址,则输出构造失败 {cout<<"构造失败"<<endl;}cout<<"-->已经申请好空间"<<endl;  //否则提示空间申请成功 strcpy(m_name,name);  //将传入有参构造的参数指针赋值给成员指针 m_num = num;  cout<<"已调用有参构造..."<<endl;}//自定义拷贝构造函数 Person(const Person &p)//p是一个引用类型,括号内相当于Box p=b1{cout << "--------------------拷贝构造函数----------------------" << endl;m_name= (char *)calloc(1, strlen(p.m_name)+1);  //在拷贝构造函数中重新申请空间,就能够实现地址的拷贝 cout << "空间已被申请" << endl;strcpy(m_name, p.m_name);  //将引用对象常量下的m_name拷贝到私有成员数据m_name里 m_num= p.m_num;cout << "--------------------拷贝构造函数----------------------" << endl;}~Person()  //定义析构函数 {if(m_name != NULL)  //若成员指针指向空,表示空间已被释放 {cout<<"m_name的空间已被释放"<<endl;free(m_name);  //否则手动释放内存空间 m_name = NULL;}cout<<"析构函数调用结束..."<<endl;}void showPerson(){cout << "m_name = " << m_name << ", m_num = " << m_num << endl;}
};//定义有参构造的测试函数
void demo1()
{Person p1("Chung", 42607);p1.showPerson();//通过自定义 拷贝构造函数 完成深拷贝动作Person p2= p1;
}//定义无参构造的测试函数
void demo2()
{Person p3;//p3.showPerson();//通过自定义 拷贝构造函数 完成深拷贝动作Person p4= p3;p4.showPerson();
}//定义主函数
int main(int argc, char *argv[])
{demo1();  //调用测试函数 //demo2();return 0;
}

(1)测试demo1

(2)测试demo2

C++析构函数与构造函数深拷贝浅拷贝(C++初学面向对象编程)相关推荐

  1. C++构造函数的各种用法全面解析(C++初学面向对象编程)

    文章目录 一.构造函数的基本用法 二.带参构造函数与其调用 三.拷贝构造函数 四.构造函数的重载 一.构造函数的基本用法 1.构造函数概念 一个类的对象被创建的时候,编译系统对象分配内存空间,并自动调 ...

  2. C++对象数组与对象指针的用法【C++初学面向对象编程】

    文章目录 一.对象数组 二.对象指针 一.对象数组 1.概念 对象数组本质上就是:数组中每一个元素都是同一个类的对象. //定义对象数组(装有3个对象的数组) Box aa[3]={Box(1, 1, ...

  3. C++ 构造函数、复制构造函数,拷贝构造函数(深拷贝、浅拷贝)

    文章目录 前言 一.什么是构造函数? 二.构造函数的分类 复制构造函数 复制构造函数被调用的三种情况 复制构造函数在以下三种情况下会被调用. 三.拷贝构造函数的分类 深.浅拷贝构造函数的区别 示例代码 ...

  4. C++拷贝构造函数(深拷贝,浅拷贝)

    对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. ...

  5. C++拷贝构造函数(深拷贝与浅拷贝)

    对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. ...

  6. JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝

    本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 系列笔记: JavaScript 面 ...

  7. 【小白学习C++ 教程】十二、C++面向对象编程中的构造函数和析构函数

    @Author:Runsen 面向对象编程旨在:在编程中实现继承.隐藏.多态等现实世界的实体.OOP 的主要目的是将数据和对它们进行操作的函数绑定在一起. 我们可以说C++中的类,代表一组共享一些共同 ...

  8. java深拷贝和浅拷贝_Java 深拷贝浅拷贝 与 序列化

    一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会 ...

  9. Java基础 深拷贝浅拷贝

    Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{private int id;private String name ...

最新文章

  1. 高调coding,低调做人 peakflys Libjingle和各协议的关系
  2. 投票系统之防止重复投票
  3. [游戏模版15] Win32 飞机射击
  4. HALCON双目三维重建实验
  5. leetcode:44. 通配符匹配
  6. Java HashSet和HashMap源码剖析
  7. 魔术命令python_Python前10个魔术命令可以帮助您提高生产率
  8. mysql count(*),count(1)与count(column)区别
  9. vscode 连接docker_在VS Code中使用带Docker容器的Java开发环境 – Bruno Borge
  10. I/O 多路复用的特点:
  11. Ubuntu[16.04/18.04/20.04] arm 下修改本地源 sources.list 为国内镜像
  12. 计算机vfp实验小结,vfp实验1报告心得体会
  13. Python计算流体动力学(CFD)模拟人体呼吸系统
  14. miui怎么用第三方图标包_非常棒的安卓第三方桌面lawnchair体验 “Google Pixel” 样式...
  15. 关闭idea任务栏小图标
  16. 小新pro16独显版安装NVIDIA驱动
  17. 一文读懂哈希算法SHA256
  18. elementUI中el-table树形与el-tree树形结构的一键折叠与展开
  19. 基于标签的蛋白质定量技术-iTRAQ,TMT
  20. 区块链让知识产权保护更容易

热门文章

  1. 论坛在线时间挂机器_直播预告 | 智控未来——控制与机器人专题研讨会
  2. wordpress页面里可不可以写php,如何在WordPress页面中创建不同的可编辑部分?
  3. c语言实验转换字母顺序结构,实验1顺序结构的程序设计-实验报告.doc
  4. android go解析json,Go 关于Json通用解析
  5. 计算机科学课程规范,计算机科学及技术学院《本科生课程设计规范化要求》.doc...
  6. 小米蓝牙左右互联_小米真无线蓝牙耳机Air2评测:支持弹窗动画,半入耳设计全面升级...
  7. 重庆大学微型计算机基础实验,计控课程方案设计书.doc
  8. java中对list监听_java – Guava:为ListenableFuture回调和监听器设置默认的Executor
  9. 原生ajax的post方法,原生js实现ajax及get post方法
  10. python支付程序源码_支付宝推出新活动,Python脚本能让你赚的更多!(附源码)...