C++ ——析构函数

1、特点:

(1)析构函数是与构造函数对立的函数,如下表所示:

构造函数

析构函数

不需要用户调用,创建对象时自动调用

当对象销毁时,自动调用

函数名:类名

函数名:~类名

构造函数可以重载

析构函数没有参数,不能重载

用于创建对象时,初始化对象属性

用于销毁对象时,释放资源

有返回值但是不写,void也不行

返回值是新创建的对象

没有返回值

(2)不显式给出析构函数,会有默认的析构函数,函数体为空,参数也为空。给出析构函数,编译器就不在提供默认析构函数

2、作用

        析构函数是在对象销毁时,做一些善后工作,例如释放之前申请的空间,避免内存泄漏 

3、编译器默认的析构函数

    ~类名(){
    }

4、析构函数

#include 
using namespace std;
class Test{
private:
    int num;
public:
    Test(int num)
        :num(num){cout<<"对象创建了"< 
   
    int get_num(){
        return num;
    }
    //析构函数
    ~Test(){
        cout<<"对象销毁了"< 
   
    }
};
int main(){
    Test t1(100);
    Test*t2=new Test(99);
    delete t2;
    t2=NULL;
    return 0;
}

5、深拷贝代码优化:利用析构函数,进行堆区内存释放

#include 
#include 
using namespace std;
class Animal{
private:
    string kind;  //种类
    double weight;  //体重
    char*hobby;  //爱好
public:
    //构造函数---->深拷贝
    Animal(string k,double w,char*h){
        kind=k;
        weight=w;
        //创建对象时,指针属性要有自己独立的区域
        hobby=new char[20];
        strcpy(hobby,h);
    }
    //展示信息
    void show(){
        cout<<"种类:"< 
   
    }
    //kind读接口
    string get_kind(){
        return kind;
    }
    //拷贝构造函数---->深拷贝
    Animal(const Animal&c){
        kind=c.kind;
        weight=c.weight;
        //拷贝对象时,由地址拷贝变成内容拷贝
        hobby=new char[20];
        strcpy(hobby,c.hobby);
    }
    //析构函数
    ~Animal(){
        delete hobby;
    }
};
int main(){
    char h[20]="eat fish";
    Animal cat1("小猫",12,h);  //调用有参构造函数
    cat1.show();
    Animal cat2(cat1);  //调用拷贝构造函数
    cat2.show();
    return 0;
}

你可能感兴趣的:(c++,开发语言)