类和对象—3
Posted 麋璐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类和对象—3相关的知识,希望对你有一定的参考价值。
今天还是来分享有关类和对象的知识,接着上期的知识,今天我们来谈谈析构函数和拷贝构造函数,本次我们着重关注构造函数的概念和应用方面。(代码演示为vs2013编译器)
首先让我们来看析构函数,就是在对象销毁时,由编译器自动调用(将对象中的资源拿走),与构造函数功能相反(构造函数是在对象创造时,往对象中放资源),局部销毁对象的工作由编译器完成。而对象在销毁时自动调用析构函数,完成类的一些资源清理工作。
我们以C语言中栈的实现为例:
上图是一个以C++方式类实现的简易栈,我们可以发现,以前的Destory函数不见了,新加入了一个~Stack函数;并且该函数不能有返回值,也不能有参数(不能重载),这就是析构函数,那么这个函数如何被调用呢??
图中解释的很详细了,线条有点多,希望大家放大后慢慢梳理。
到这,我们先来总结一下析构函数的特性:
1.析构函数名实在类名前加上字符~
2.无参数,无返回值(可以Stack(void))
3.一个类有且只有一个析构函数。若未定义,系统会自动生成默认的析构函数
4.对象生命周期结束时,C++编译器系统会自动调用析构函数
注意:在语法上讲,析构函数没有显式定义,则编译器会自动生成一份无参的默认构造函数;析构函数没有显示定义,则编译器会自动生成一份析构函数。但是对于编译器而言,更注重的是效率,所以有时并不会严格按照语法来执行,例如:
在C语言中,如果我们用两个函数构造一个新的函数(两个函数都需要malloc开辟空间),那么在释放空间时,要先调用新函数释放,在释放两个函数,这既要顺序对,又要调用;而对于C++的析构函数,我们只需要在两个类中构造两个析构函数,系统在释放空间时,会自动调用,非常方便!!
以上就是析构函数的全部内容,有遗漏的朋友可以在评论区留言。接下来我们来讲拷贝构造函数。
我们先来看代码:
我们直接在d2创建后面加入了d1,就创建了和d1一样的对象
拷贝构造:只有单个形参,该形参是对本类型对象的引用(一般用const修饰,保证只复制,不改变),在用已存在的类类型对象创建新对象时由编译器自动调用。
我们也可以自己写函数调用拷贝构造函数;若我们不构造,当要使用时,系统也会自动生成并调用拷贝构造函数。
我们再来说一下拷贝构造函数的特点:
1.拷贝构造函数是构造函数的一个重载形式
2.拷贝构造函数的参数只有一个且必须使用引用传参,使用传参方式会引发无穷递归调用
下面我们来解释为什么拷贝构造对象的参数必须使用引用传参:
3.若为显示定义,系统生成默认的拷贝构造函数。默认的拷贝构造函数对象安内存储存按字节序完成拷贝,这种拷贝我们称为浅拷贝或值拷贝(浅拷贝后果:多个对象共用同一分资源,当这些对象销毁时,资源会多次释放造成程序崩溃)
那么问题来了,既然我们不去创建拷贝构造函数系统就可以为我们创造,那么是否我们就可以直接使用系统默认的拷贝构造函数呢?
我们先来揭晓答案:对于没有涉及资源管理的类是可以的,但是类中一旦涉及到资源的管理,拷贝构造函数我们就一定要自己实现
今天的内容就到这里,希望大家可以好好理解上面的知识点,感谢大家的观看,谢谢!!!
以上是关于类和对象—3的主要内容,如果未能解决你的问题,请参考以下文章