功能:销毁对象前执行清除工作
格式:
[类名::]~类名()
{
....
}
class Student {public: Student(...); ~Student();//~符号 void display()const; private: int m_iNum; string m_strName; char m_cSex; }; Student::~Student() { cout<<"Destructor "<<endl;} … …
注意:
函数名与类名相同,且函数名前加~
没有参数、不能被重载
不指定返回值
常定义为public
对象生命期结束时自动调用
思考:
通常不需人为定义析构函数,什么时候必须定义析构函数?
一般,当类中含有指针成员,并且在构造函数中用指针指向了一块堆中的内存,则必须定义析构函数释放该指针申请的动态空间
#include<iostream> using namespace std; class String { public: String(); void display() const; private: char *m_pstr; }; String::String() { m_pstr = new char[1000]; strcpy(m_pstr, "hello"); } void String::display() const { cout<<m_pstr<<endl; } /* String::~String() { //系统生成的 } */ int main() { String str; str.display(); system("pause"); return 0; }
看下面的代码,使用自己定义的析构函数--示例代码1:
#include<iostream> using namespace std; class String { public: String(); ~String(); void display() const; private: char *m_pstr; }; String::String() { m_pstr = new char[1000]; strcpy(m_pstr, "hello"); } String::~String() { delete []m_pstr; } void String::display() const { cout<<m_pstr<<endl; } int main() { String str; str.display(); system("pause"); return 0; }
示例代码2:
#include<iostream> using namespace std; class String { public: String(char *ap = "china"); ~String(); void display() const; private: char *m_pstr; }; String::String(char *ap) { m_pstr = new char[strlen(ap)+1]; strcpy(m_pstr, ap); } String::~String() { delete []m_pstr; } void String::display() const { cout<<m_pstr<<endl; } int main() { String str1("USA"); str1.display(); String str2; str2.display(); system("pause"); return 0; }
如果要定义析构函数,通常也需要定义拷贝构造函数和赋值运算符的重载函数。
时间: 2024-12-01 17:13:22