构造函数:
在类实例化对象时自动执行,对类中的数据进行初始化。构造函数可以从载,可以有多个,但是只能有一个缺省构造函数。
析构函数:
在撤销对象占用的内存之前,进行一些操作的函数。析构函数不能被重载,只能有一个。
调用构造函数和析构函数的顺序:
先构造的后析构,后构造的先折构。它相当于一个栈,先进后出。
#include<iostream> #include<string> using namespace std; class Student{ public: Student(string,string,string); ~Student(); void show(); private: string num; string name; string sex; }; Student::Student(string nu,string na,string s){ num=nu; name=na; sex=s; cout<<name<<" is builded!"<<endl; } void Student::show(){ cout<<num<<" "<<name<<" "<<sex<<endl; } Student::~Student(){ cout<<name<<" is destoried!"<<endl; } int main(){ Student s1("001","千手","男"); s1.show(); Student s2("007","纲手","女"); s2.show(); cout<<"nihao"<<endl; cout<<endl; cout<<"NIHAO"<<endl; return 0; }
先构造的千手,结果后析构的千手;后构造的纲手,结果先折构的纲手。
特点:
在全局范围定义的对象和在函数中定义的静态(static)局部对象,只在main函数结束或者调用exit函数结束程序时,才调用析构函数。
如果是在函数中定义的对象,在建立对象时调用其构造函数,在函数调用结束、对象释放时先调用析构函数。
#include<iostream> #include<string> using namespace std; class Student{ public: Student(string,string); ~Student(); void show(); string num; string name; }; Student::Student(string nu,string na){ num=nu; name=na; cout<<name<<" is builded!"<<endl<<endl; } void Student::show(){ cout<<num<<" "<<name<<endl<<endl; } Student::~Student(){ cout<<name<<" is destoried!"<<endl<<endl; } void fun(){ cout<<"============调用fun函数============"<<endl<<endl; Student s2("002","自动局部变量");//定义自动局部对象 s2.show(); static Student s3("003","静态局部变量");//定义静态局部变量 s3.show(); cout<<"===========fun函数调用结束=============="<<endl<<endl; } int main(){ Student s1("001","全局变量"); s1.show(); fun(); cout<<" this is some content before the end ";//这是一段位于main函数结束之前,函数调用之后的内容 cout<<endl; return 0; }
结果显示:
在函数内部定义的自动局部变量在fun函数调用结束以后就立即执行了析构函数;
而全局变量和静态局部变量是在main函数结束之前才执行了折构函数,并且遵循了先构造后析构,后构造先析构的原则。