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()
李四被释放
被释放
被释放
张三被释放
被释放
*/
//释放顺序正好与构造顺序相反