• 6、析构函数


    1、析构函数的概念
    析构函数与构造函数相对应。当编译器创建一个对象后,会自动的调用构造函数对创建的对象进行初始化。而当编译器要销毁一个对象前,析构函数会被自动的执行,进行善后工作的处理。

    2、析构函数的特点

    • 名字与类名相同,在前面加‘~’ , 没有参数和返回值,一个类最多只能有一个析构函数。
    • 如果定义类时没写析构函数,则编译器生成缺省析构函数。缺省析构函数什么也不做。
      如果定义了析构函数,则编译器不生成缺省析构函数。

    注意:

    • 后两条类似于默认析构函数,对应默认构造函数。
    • 只要有对象消亡,就一定有析构函数被调用。

    3、析构函数的作用
    做善后工作,例如:释放分配的空间。
    如果一个类中使用new符号动态分配了内容,那么就一定需要使用delete进行释放,那么将delete语句放在哪里合适呢? 放在析构函数中。因为一个对象在销毁之前一定会执行析构函数。

    4、析构函数的例子

    //例1:释放动态分配的内存
    class String{
    private :
    	char * p;
    public:
    	String () {
    	p = new char[10];
    	}
    	~ String () ;
    };
    String ::~ String()
    {
    	delete [] p;
    }
    

    5、析构函数和数组

    • 对象数组生命期结束时,对象数组的每个元素的析构函数都会被调用。
    class Ctest {
    public:
    	~Ctest() { cout<< "destructor called" << endl; }
    };
    int main () {
    	Ctest array[2];				//创建了两个对象
    	cout << "End Main" << endl;
    	return 0;
    }
    /*
    输出:
    End Main
    destructor called			 
    destructor called
    说明析构函数被调用了 两次
    */
    

    6、析构函数和delete、new

    • delete 运算导致析构函数调用。
    Ctest * pTest;
    pTest = new Ctest;  //new 对象,导致无参构造函数(默认构造函数)调用
    delete pTest; 		//delete对象,导致析构函数调用
    
    • 若new一个对象数组,那么用delete释放时应该写 []。否则只delete一个对象(调用一次析构函数)
    pTest = new Ctest[3]; //new对象数组,导致无参构造函数(默认构造函数)调用3次
    delete [] pTest; //delete对象数组,导致析构函数调用3次
    
    

    7、析构函数在对象作为函数返回值返回后被调用

    class CMyclass {
    public:
    	~CMyclass() { cout << "destructor" << endl; }
    };
    
    CMyclass obj;	//全局变量
    
    CMyclass fun(CMyclass sobj ) { //参数对象消亡也会导致析
    	//复制构函数被调用,创建一个形参对象对象sobj
    	return sobj; //函数调用返回时生成临时对象返回
    }
    //形参对象在fun()函数执行完以后被销毁。
    //返回的临时对象,在调用该函数的语句结束后被销毁。
    int main(){
    	obj = fun(obj); //函数调用的返回值(临时对象)赋值给obj,该语句结束后,返回值(临时对象)被销毁
    	return 0; 
    }
    /*
    输出:
    destructor    	形参对象被销毁
    destructor		返回的临时对象被销毁
    destructor		主函数中的obj对象被销毁
    */
    
  • 相关阅读:
    简单的嵌套循环
    七、 二进制位运算
    六、字符串格式化--------列表常用操作
    JavaScript取消默认控件并添加新控件(DOM编程艺术第11章)
    JavaScript 字符串拼接 & setInterval()实现简单动画
    伪站创建代码-山东理工
    CSS常用样式
    CSS基础知识
    HTML5其他标签应用
    HTML表单的应用
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764285.html
Copyright © 2020-2023  润新知