C++析构函数

本文地址:http://www.cnblogs.com/archimedes/p/cpp-destructor.html,转载请注明源地址

功能:销毁对象前执行清除工作

格式:

[类名::]~类名()

{

   ....

}

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;
} 

如果要定义析构函数,通常也需要定义拷贝构造函数和赋值运算符的重载函数。关于拷贝构造函数,可以参考《C++拷贝构造函数

 

posted @ 2015-01-25 01:40  wuyudong  阅读(365)  评论(0编辑  收藏  举报
Top_arrow