建構函式和析構函式
建構函式和析構函式是在類體中說明的兩種特殊的成員函式。建構函式的功能是在建立物件時,使用給定的值來將物件初化。析構函式的功能是用來釋放乙個物件的,在物件刪除前,用它來做一些清理工作,它與建構函式的功能正好相反。下面舉一例子來說明建構函式和析構函式的特點:
class tdate
;//類的實現部分
tdate::tdate(int y, int m, int d)
tdate::~tdate()
int tdate::isleapyear()
void tdate::print()
類體內說明的函式tdate()是建構函式,而~tdate()是析構函式。建構函式的特點如下:
1、建構函式是成員函式,函式體可寫在類體內,也可定在類體外。
2、建構函式是乙個特殊的函式,該函式的名字與類名相同,該函式不指定型別說明,它有隱含的返回值,該值由系統內部使用。該函式可以乙個引數,也可以有多個引數。
3、建構函式可以過載,即可以定義多個引數個數不同的函式。
4、程式中不能直接呼叫建構函式,在建立物件時系統自動呼叫建構函式。
析構函式的特點如下:
1、析構函式是成員函式,函式體可寫在類體內,也可定在類體外。
2、析構函式也是乙個特殊的函式,它的名字同類名,並在前面加「~」字元,用來與建構函式加以區別。析構函式不指定資料型別,並且也沒有引數。
3、乙個類中只可能定義乙個析構函式。
4、析構函式可以被呼叫,也可以系統呼叫。在下面兩種情況下,析構函式會被自動呼叫。
·如果乙個物件被定義在乙個函式體內,則當這個函式結束時,該物件的析構函式被自動呼叫。
·當乙個物件是使用new運算子被動態建立的,在使用delete運算子釋放它時,delete將會自動呼叫析構函式。
下面用一程式說明建構函式和析構函式的應用:
#include
#include
#include "tdate.h" //類的定義存放在該檔案中
void main()
讀者可以自行除錯該程式,並分析其結果。要在vc環境下除錯該程式,要對程式進行一些引數設定,否則無法正常執行(主要是去掉mfc的支援——該程式無需mfc的支援)。
預設建構函式和預設析構函式
在類定義時沒有定義任何建構函式時,則編譯器自動生成乙個不帶引數的預設建構函式,其格式如下:
《類名》::《預設建構函式名》()
按建構函式的規定,預設建構函式名同類名。預設建構函式的這樣格式也可由程式設計師定義在類體中。在程式中定義乙個物件而沒有指明初始化時,則編譯器便按預設建構函式來初始化該物件。用預設建構函式對物件初始化時,則將物件的所有資料成員都初始化為零或空。
同理,如果乙個類中沒有定義析構函式時,則編譯系統也生成乙個稱為預設析構函式數,其格式如下:
《類名》::~《預設析構函式名》
《預設析構函式名》即為該類的類名。預設析構函式是乙個空函式。
拷貝初始化建構函式
拷貝初始化建構函式是一種特殊的成員函式,它的功能是用乙個已知的物件來初始化乙個被建立的同類的物件。拷貝初始化建構函式實際上也是建構函式,它是在初始化時被呼叫來將乙個已知物件的資料成員的值拷貝給正在建立的另乙個同類的物件。
拷貝衩始化建構函式的特點如下:
1、該函式名同類名,因為它也是一種建構函式,並且該函式也不被指定返回型別。
2、該函式只有乙個引數,並且是對某個物件的引用。
3、每個類都必須有乙個拷貝初始化建構函式,其格式如下:
《類名》::《拷貝初始化建構函式名》(const《類名》&《引用名》)
其中,《拷貝初始化建構函式名》是與該類名相同的。const是乙個型別修飾符,被它修飾的物件是乙個不能被更新的常量。
如果類中沒有說明拷貝初始化建構函式,則編譯系統自動生成乙個具有上術形式的預設拷貝初始化建構函式。作為該類的公有成員。
下面舉一例子說明拷貝初始化建構函式
class tpoint
tpoint(tpoint & p);
~tpoint()
int xcoord()
int ycoord()
private:
int x, y;
};tpoint::tpoint(tpoint & p)
#include
void main()
該程式的輸出結果為:
拷貝初始化建構函式被呼叫。
p2=5,7
析構函式被呼叫。
析構函式被呼叫。
關於拷貝初始化建構函式的其他用法,可從下例看出:
#include
#include "tpont.h" //類的定義放於該檔案中
tpoint f(tpoint q);
void main()
tpoint f(tpoint q)
請大家自行除錯該程式,並分析其結果。
總結:拷貝初始化建構函式的功能就是用乙個已知的物件來初始化另乙個物件。在下述三種情況下,需要用拷貝初始化建構函式來用乙個物件初始化另乙個物件。
1、明確表示由乙個物件初始化另乙個物件時,如:tpoint p2(p1);
2、當物件作為函式實參傳遞給函式形參時,如:上例 p = f(n);
3、當物件用為函式返回值時,如:上例 return r;
C 物件初始化
形式 new t object 值初始化形式 new t object 預設初始化形式 new t object 二者區別 只要使用了括號 圓括號或花括號 就是值初始化。可以簡單理解為括號提醒編譯器你想要用某個值賦給物件。沒有使用括號,就是預設初始化。可以簡單理解成,你不加任何東西,編譯器就會使用預...
物件初始化
在oc中使用alloc後,會分配到一塊記憶體塊,同時這塊記憶體塊會被清零,所以初始化函式init是不需要再做置零的操作的。在oc中,應該在alloc後就呼叫初始化函式init,使用new可以達到這個效果,但new不是oc的風格。物件在init時,應該先使用其父類的init,然後再使用自己的init行...
物件初始化
我們知道當使用new關鍵字建立乙個物件的時候,會呼叫相應的建構函式對該物件進行初始化,那麼這個過程中到底都還有什麼事情呢?先看一段 當執行語句 student stu new student zhangsan 17 執行該語句的時候在記憶體中程式都做了什麼事情,讓我們一一枚舉出來 1 因為new用到...