析构函数是与构造函数作用相反的函数。
当对象的生命周期结束时,会自动执行析构函数。
说明:
(1)如果在一个函数中定义了一个对象,当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
(2)静态(static)局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或者调用exit函数结束程序时,才调用static局部对象的析构函数。
(3)全局对象在程序的流程离开其作用域时,调用该全局对象的析构函数。
(4)如果用new运算符动态地建立了一个对象,当用delete预算符释放该对象时,西安调用该对象的析构函数。
析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。析构函数不返回任何职,没有函数类型,也没有函数参数。由于没有函数参数,它不能被重载。一个类可以有多个构造函数,但是只能有一个析构函数。
析构函数是在声明类的时候定义的,析构函数可以完成类的设计者所指定的任何操作。
如果用户没有定义析构函数,C++编译系统会自动生成一个析构函数。(如果自定义析构函数什么也不干,也就没有了意义。)
#include
#include
using namespace std;
class Student
{
public:
Student(int n, string nam, char s)
{
num = n;
name = nam;
sex = s;
cout << "Cc." << endl;
}
~Student()
{
cout << "Dc." << endl;
}
void display()
{
cout << "num:" << num << endl;
cout << "name:" << name << endl;
cout << "sex:" << sex << endl;
}
private:
int num;
string name;
char sex;
};
int main()
{
Student stud1(1001, "huang", 'f');
stud1.display();
Student stud2(1002, "yao", 'm');
stud2.display();
return 0;
}
调用析构函数的次序正好与调用构造函数的次序相反。
先构造的后析构,后构造的先析构。它相当于一个栈,先进后出。
归纳系统在什么时候调用够着函数和析构函数:
(1)若为全局对象,那么他的构造函数在本文件模板中的所有函数(包括main函数)执行之前调用。如果一个程序包含多个文件,而在不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或者调用exit函数时,调用析构函数。
(2)若为局部对象,则在建立对象时调用其构造函数。如果对象所在的函数被多次调用,则在每次建立对象时都要调用构造函数,在函数调用结束,对象释放时先调用析构函数。
(3)若为static局部对象,则只在程序第一次调用此函数定义对象时调用构造函数一次,在调用函数结束时对象并不释放,因此也不调用析构函数,只在main函数或调用exit函数结束程序时,才调用析构函数。
数组可以由类对象组成。对象数组的每一个元素都是同类的对象。
在建立数组时,同样要调用构造函数。如果有50个元素,需要调用50次构造函数。在需要时可以在定义数组时提供实参以实现初始化。如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供实参。
Student stud[3]={60,70,80};
如果构造函数有多个参数,则不能在定义数组时直接提供所有参数。
编译系统只为每个对象元素的构造函数传递一个实参,所以在定义数组时提供的实参个数不能超过数组元素的个数。
构造函数有多个参数,在定义对象数组时应这样实现初始化:
在花括号中分别写出构造函数名并在括号内指定实参。
Student Stud[3]={
Student(11,12,13),
Student(34,35,36),
Student(98,97,09)
};
例题:计算和输出三个立方体的体积。
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
//利用对象数组
class Box
{
public:
Box(int c,int k,int g);
int V_box();
private:
int chang;
int kuan;
int gao;
};
Box::Box(int c,int k,int g)
{
chang = c;
kuan = k;
gao = g;
}
int Box::V_box()
{
return (chang* kuan* gao);
}
int main()
{
Box box[3] = {
Box(10,20,30),
Box(11,22,33),
Box(33,44,10)
};
cout << "V1=" << box[0].V_box() << endl;
cout << "V2=" << box[1].V_box() << endl;
cout << "V1=" << box[2].V_box() << endl;
return 0;
}