详解析构函数、拷贝构造函数
目录
一.析构函数(析构器)
(一).使用方式及注意事项
1.使用方式
2.注意事项
(二).默认析构函数
二.拷贝构造函数
(一).使用方式及注意事项
1.使用方式
2.注意事项
(二).默认拷贝构造函数
一.析构函数(析构器)
析构函数是在一个对象被销毁前,用来清理该对象空间的。
(一).使用方式及注意事项
1.使用方式
在销毁对象时,编译器会自动调用析构函数。因此析构函数不写参数。
析构函数的函数名是~类名,这是C++所规定的用法。
2.注意事项
①析构函数不是销毁对象,而是清理对象内定义的空间。比如malloc、new空间的释放之类
②定义多个对象时,先定义的后调用析构函数,后定义的先调用析构函数。这符合栈先入后出的原则。当然在静态区存放的对象是在局部变量后析构的,例如static和全局变量。
③析构函数一般不必自定义,编译器有默认生成。但如果有malloc、new之类自定义类型,需要手动写。
④析构函数的意义就是便于对象空间的释放,当有多个对象时,不必再每个都free/delete。只有明白析构器的意义才能更好的使用。
(二).默认析构函数
当没有手动编写时,编译器也有自己默认的析构函数。
在默认析构函数中,内置类型不进行处理,自定义类型会调用自己的析构函数。
内置类型不处理是因为析构之后即将对空间进行释放,即便对它处理也起不到作用。
比如即便将int类型的值归为0,但马上的函数销毁又会把int类型空间释放。
但是,malloc、new开辟的空间不能用默认析构。默认析构不会对其处理,反而会因为不处理导致内存泄漏。
二.拷贝构造函数
拷贝构造函数是用来在类定义时,将其复制成一个已有的对象。
(一).使用方式及注意事项
1.使用方式
拷贝构造的函数名与类名相同,但参数也必须是该类。
参数必须是该类的引用,且最好加上const,之后会说明。
调用拷贝构造有两种方式:
①类 对象A(对象B);
②类 对象A = 对象B;
2.注意事项
①拷贝构造参数必须是类的引用。因为在创建形参时,形参是实参的临时拷贝,也是一次拷贝构造。拷贝构造就会有形参产生,势必又是一次拷贝构造。所以,只要形参不是实参本身,就会一直调用拷贝构造来创建形参,导致死循环。
因此,我们只有调用实参本身,形参才不会对实参进行临时拷贝。
②形参最好加上const。这是因为拷贝构造是复制,本身不会改变参数的值。但形参本身又是实参的引用,如果拷贝构造内部出现问题,就有可能会改变实参的值,加上const是排除这种风险。
③拷贝构造只能是类在定义时被调用。这里我们上图理解:
(二).默认拷贝构造函数
如果我们没有手写拷贝构造,编译器会自动生成一个默认拷贝构造。
在默认拷贝构造中,内置类型按字节拷贝,自定义类型会调用自己的拷贝构造。
所以一般情况下,我们不需要手写拷贝构造。
但是,如果我们的类中有指针之类存放地址的变量,就不能使用默认拷贝构造。
因为,默认按字节拷贝,只会拷贝指针存放的地址(浅拷贝)。也就是说,定义的新的对象和旧的对象指针指向的是同一块空间。这不是拷贝的本意。
这时就需要我们手写拷贝。(深拷贝)
- “每名程序员都是作家。”——塞坎·雷勒克(Sercan Leylek)
如有错误,敬请斧正
详解析构函数、拷贝构造函数相关推荐
- 详解面向对象、构造函数、原型与原型链
详解面向对象.构造函数.原型与原型链 为了帮助大家能够更加直观的学习和了解面向对象,我会用尽量简单易懂的描述来展示面向对象的相关知识.并且也准备了一些实用的例子帮助大家更加快速的掌握面向对象的真谛. ...
- C++ explicit关键字详解(用于构造函数)
C++ explicit关键字详解(用于构造函数) C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. ...
- 详解派生类构造函数与析构函数
1.派生类构造函数: 派生类不能继承基类的构造函数,必须自己定义构造函数进行新增数据成员初始化工作,如果想同时初始化基类数据成员,必须调用基类构造函数. (1)简单派生类构造函数: 1 #includ ...
- spring配置详解-属性注入(构造函数)
再来看一下构造函数注入,构造函数注入呢,我还是在这个配置文件里演示,构造函数了,我分割一下,华丽的分割线下方,来演示一下构造函数注入,构造函数注入,现在不走set方法了,我是不是要走构造,那走构造的前 ...
- linux之cp/scp命令+scp命令详解---远程拷贝
名称:cp 使用权限:所有使用者 使用方式: cp [options] source dest cp [options] source... directory 说明:将一个档案拷贝至另一档案,或将数 ...
- 详解JavaScript创建对象——构造函数模式
文章目录 一.什么是构造函数? 二.构造函数与普通函数的区别 1.new 2.new.target 三.使用构造函数 四.构造函数的问题 总结 一.什么是构造函数? 在一些面向对象的语言,如Java. ...
- C++——拷贝构造函数详解
C++--拷贝构造函数详解 1.拷贝构造函数的特点: 2.通过例子引入拷贝构造: 3构造对象的时候使用引用返回与不使用引用返回的问题: 3.1不使用引用返回: 3.2引用返回--从已经死亡的地址接收值 ...
- c++类的构造函数详解
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...
- [转]c++类的构造函数详解
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...
最新文章
- MySQL 创建数据表
- php监听input,jQuery如何实时监听获取input输入框的值
- Linux C/C++ 链接选项之静态库--whole-archive,--no-whole-archive和--start-group, --end-group
- Google Chubby 论文翻译
- MySQL 数据恢复
- django 允许跨域请求
- PHP 实现实时通信一般有两种方式
- Wireshark实战分析之DHCP协议(一)
- linux之程序包管理器(rpm)
- 【Windows 问题系列第 5 篇】常见电脑蓝屏的解决办法
- 计蒜客 - T1212 仙岛求药 BFS+DFS剪枝
- windows副本不是正版怎么解决_黑屏、蓝屏、卡顿、死机怎么解决?教你免重装Windows解决问题...
- 如何进行 360 评估
- android 画布画笔,安卓画笔笔锋的实现探索(一)
- 【K8S系列】快速初始化⼀个最⼩集群
- 设定绘图区坐标轴及标题字体、字号的两种方法
- Eclipse中同时打开多个控制台(Console)
- oppoR11S安装应用一直失败
- W77E58在GPS远程定位的应用(源代码) .
- 【国际】费城联邦储备银行会议探索区块链对金融稳定的影响