实验目的
掌握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消亡;
实验结论
通过本次实验,我们掌握了构造函数和析构函数的使用,特别是了解了析构函数会在什么情况下进行调用,这对以后写一些大项目是很有帮助的。