析构函数的理解

什么是析构函数:

当一个类的对象离开作用域(例如对象所在的函数已调用完毕)时,析构函数将被调用(系统自动调用,或者是调用用户自己写的析构函数),析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。析构函数的名字和类名一样,不过要在前面加上 ~ 。对一个类来说,只能允许一个析构函数,析构函数不能有参数,并且也没有返回值。析构函数的作用是完成一个清理工作,如释放从堆中分配的内存。

以C++为例:析构函数名也应与类名相同,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显示的析构函数。

#include<iostream>

using namespace std;

class T

{

    public:

     ~T(){cout<<"析构函数被调用。";} 

 };

int main()

{

     T *t=new T();//建立一个T类的指针对象t

     delete t;

     cin.get();

};

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。

C++中, 一个参数的构造函数, 承担了两个角色。

1、 是个构造器

2 、是个默认且隐含的类型转换操作符。

explicit构造函数的作用

解析:

explicit构造函数是用来防止隐式转换的。请看下面的代码:

1 class Test1

2 {

3 public:

4 Test1(int n) { num = n; } //普通构造函数

5 private:

6 int num;

7 };

8

9 class Test2

10 {

11 public:

12 explicit Test2(int n) { num = n; } //explicit(显式)构造函数

13 private:

14 int num;

15 };

16

17 int main()

18 {

19 Test1 t1 = 12; //隐式调用其构造函数, 成功

20 Test2 t2 = 12; //编译错误,不能隐式调用其构造函数

21 Test2 t3(12); //显示调用成功

22 return 0;

23 }

Test1的构造函数带一个int型的参数,代码19行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码20行会出现编译错误。

普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用。

class Stack {

explicit Stack(int size);

..

}

explicit 表示禁止从类型int到类型Stack的隐式转换:

Stack s1(40); // OK

Stack s2 = 40; // Error

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值