程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++析構函數,函數

C++析構函數,函數

編輯:C++入門知識

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++拷貝構造函數》

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved