C++程序设计——二

实验目的

掌握C++中构造函数和析构函数的相关知识和使用

实验内容

构造函数

两种构造函数

类的构造函数时类的一种特殊的成员函数,它在每次创建类的新对象时执行;
构造函数的名称和类的名称必须完全一样,并且不会返回任何类型,也不会返回void;
其中,构造函数可以根据需要进行多次重载,比如根据情况不同,有时会需要int类型的参数,有时会需要double类型的参数,甚至有时不需要参数;
总体来说,构造函数可分为两种,有参构造函数和无参构造函数,其中有参构造函数又可根据需要进行多次重载
如下:
在这里插入图片描述
在这里插入图片描述

自定义类的构造函数

在前面,我常常是直接在类内定义函数,也可以在类内先声明函数,再在类外定义函数,如下
在这里插入图片描述

构造函数的其他写法

如下
在这里插入图片描述
这种方法叫成员初始化列表,它的格式为:
类名::类名(形参表):类属性1(形参1),类属性2(形参2)

那么它和我们常用的构造函数的形式有什么区别呢?
我们常用的方法是在构造参数里面对属性进行赋值,而上面的这种方法是初始化;
初始化发生的时间更早,发生在这些成员的default构造函数被自动调用之时。使用赋值的构造函数需要执行两次copy构造:defaultValue以10为初值进行copy构造,keyValue以key为初值进行copy构造。

因此理论上上面这种初始化列表(member initialization list)方式的效率更高,因为比起先调用default构造函数然后再调用copy assignment操作符,单只调用一次copy构造函数是比较高效的
当然,需要注意的是成员初始化列表需要和构造函数的声明中的顺序一致
在这里插入图片描述

析构函数

析构函数是特殊的成员函数,它在每次删除所创建的对象时执行,与构造函数一样,析构函数的名称和类的名称需要完全一致,不过还需要在前面加一个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。

析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源;只要对象消亡,就会引发析构函数的调用。

析构函数不能被重载,而且如果不显式定义析构函数,会调用缺省析构函数
在这里插入图片描述
对输出结果的分析:
第一次调用析构函数在19行,delete语句使得18行动态分配的testclass对象消亡;
接下来的两次析构函数调用发生在22行,delete 语句释放了第21行动态分配的数组,那个数组中有两个testclass对象消亡;
最后的两次析构函数调用发生在main函数结束时,因为在main函数最开始初始化的局部数组变量a中的两个元素消亡。

函数的参数对象以及作为函数返回值的对象,在消亡时也会引发析构函数调用,如下:
在这里插入图片描述
对输出结果的分析:
第一次调用析构函数是在32行,因为function函数结束,里面的参数对象obj也消亡;
第二次调用析构函数是在33行,同样是因为mytest函数结束,它的返回值是一个临时对象,函数调用结束后便消亡;
第三次析构函数调用是因为main函数开头定义的test2对象消亡;
第四次析构函数调用是因为整个程序结束时全局对象test1消亡;

实验结论

通过本次实验,我们掌握了构造函数和析构函数的使用,特别是了解了析构函数会在什么情况下进行调用,这对以后写一些大项目是很有帮助的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值