C++ 之析构函数

C++中的析构函数

析构函数
对象过期时自动调用特殊成员函数。
析构函数一般用来完成清理工作。
析构函数的名称是在类名前加上~。析构函数没有参数,只能有一个。

例如:

class Studet{
private:
	double * scores;
public:
	Student(int len)
	{
		//使用new分配资源
		scores = new double[len];
	}
	~Student()
	{
		delete scores;//释放资源
	}
}

注意:
1.析构函数用来试放对象使用的资源,并销毁对象的非static成员。
2.无论何时一个对象被销毁,都会自动调用其析构函数(隐式析构)。
(可以说是:一个new对应一个delete)


代码样例:

Student.h

#ifndef STUDENT_H
#define STUDENT_H
#include<iostream>
using namespace std;


class Student
{
    public:
        //构造函数重载规则与普通函数重载相同
        Student();
        Student(string name,string desc);   //带参构造  也可以写作:Student(string ,string);
        Student(int age);                   //带参构造  也可以写作:Student(int);
        //如果构造函数中,只有一个是带 唯一 地参数,操作可简化

        /*
        例如这个代码中年龄,主函数可写:
        Student stu4 = 50;
        */
        virtual ~Student();

        void ShowInfo();

        string Getname() { return m_name; }
        void Setname(string val) { m_name = val; }
        string Getdesc() { return m_desc; }
        void Setdesc(string val) { m_desc = val; }
        int Getage() { return m_age; }
        void Setage(int val) {
            if(val<0){
                m_age=18;
            }else{
                m_age = val;
            }
        }

    protected:

    private:
        string m_name;
        string m_desc;
        int m_age;
};

#endif // STUDENT_H

Student.cpp

#include "Student.h"
#include<iostream>
using namespace std;
Student::Student()
{
    //ctor
    cout<<"默认构造"<<endl;
}

Student::Student(string name, string desc)
{
    m_name = name;      //等价写法:     Setname(name);
    m_desc = desc;      //等价写法:    Setdesc(desc);
    cout<<"调用带参构造:Student(string name, string desc)"<<endl;

}
/**
Student::Student(string name, string desc)还可以这样写:
//初始化参数列表的写法
Student::Student(string name, string desc):m_name(name),m_desc(desc)
{
    cout<<"调用带参构造:Student(string name, string desc)"<<endl;
}

*/
Student::Student(int age)
{
    m_age=age;          //等价写法:     Setage(age);
    cout<<"调用带参构造:Student(int age)"<<endl;
}

Student::~Student()
{
    //dtor
    cout<<m_name<<"被释放"<<endl;
}
void Student::ShowInfo()
{
    cout<< m_desc <<m_name<<endl;
    cout<<"调用函数:ShowInfo()"<<endl;
}

main.cpp

#include<bits/stdc++.h>
#include "Student.h"
using namespace std;
int main()
{
    Student stu1;       //在栈内内存分配空间,速度非常快,但是放的东西少
    Student stu2("张三","我要好好学习");
    Student stu3(18);
    Student stu4=50;
    stu2.ShowInfo();

    Student* stu5 = new Student("李四","好好学习");      //分配内存的时候同时调用构造函数,堆内存分配空间,速度慢,但是放的东西多
    stu5->ShowInfo();

    //当对象使用完毕时,记得delete,释放内存!‘
    delete stu5;
    //在工程中多使用堆内存
    return 0;
}



//打印结果:
/*

默认构造
调用带参构造:Student(string name, string desc)
调用带参构造:Student(int age)
调用带参构造:Student(int age)
我要好好学习张三
调用函数:ShowInfo()
调用带参构造:Student(string name, string desc)
好好学习李四
调用函数:ShowInfo()
李四被释放
被释放
被释放
张三被释放
被释放

*/
//释放顺序正好与构造顺序相反
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值