一是建構函式,在物件建立時自動呼叫,用以完成物件成員變數等的初始化及其他操作(如為指標成員動態申請記憶體空間等);如果程式設計師沒有顯式的定義它,系統會提供乙個預設的建構函式。
另乙個是析構函式,在物件撤銷時自動呼叫,用以執行一些清理任務,如釋放成員函式中動態申請的記憶體等。如果程式設計師沒有顯式的定義它,系統也會提供乙個預設的析構函式。
當物件被建立時,建構函式自動被呼叫。
建構函式有一些獨特的地方:函式的名字與類名相同,沒有返回型別和返回值,即使是void也不能有。
1>
其主要工作有: 給物件乙個識別符號。
2>
為物件資料成員開闢記憶體空間。
3>
完成物件資料成員的初始化(函式體內的工作,由程式設計師完成)。
上述3點也說明了建構函式的執行順序,在執行函式體之前,建構函式已經為物件的資料成員開闢了記憶體空間,這時,在函式體內對資料成員的初始化便是順理成章了。 備註**給出了point類的顯式建構函式 。
class point; point::point()
建構函式可以有引數:
編譯器自動生成的預設(預設)建構函式是無參的,實際上,建構函式可以接收引數,在物件建立時提供更大的自由度,如下列**
一旦使用者定義了建構函式,系統便不再提供預設建構函式。 跟蹤執行,理解建構函式的執行順序。
#include using namespace std;
class point //point類定義,在定義同時實現其成員函式
void print() //輸出資訊
}; #include "point.h"
int main()
建構函式能夠進行過載:
一旦程式設計師為乙個類定義了建構函式,編譯器便不會為類自動生成預設建構函式,
因此,如果還想使用無參的建構函式,如「point pt1;」的形式必須在類定義中顯式定義乙個無參建構函式。
這樣,建構函式就會出現兩個,會不會有問題呢?不會,建構函式支援過載,在建立物件時,根據傳遞的具體引數決定採用哪個建構函式。
例1:
#include using namespace std;class point
point(int ix, int iy)
void print()
private:
int _ix;
int _iy;
};int main(void)
例2
#include using namespace std;
class point //point類定義,在定義同時實現其成員函式
point() //無參建構函式
void print()//輸出資訊
private: //私有成員,分泌誒代表x軸和y軸座標
int xpos;
int ypos;
};#include "point1.h"
int main()
------------------
建構函式允許按引數預設方式呼叫
上例中的建構函式可以作如下定義:
point(int x=0,int y=0)void print()
}; #include "point.h"
int main()
例子:
#include using namespace std;class point
#endif
point(int ix, int iy)
: _ix(ix)//初始化列表
, _iy(iy)
void print()
private:
int _ix;
int _iy;};
int main(void)
6 物件特性之建構函式和析構函式
物件的初始化和處理也是兩個非常重要的安全問題,c 利用建構函式和析構函式解決上述問題。這兩個函式會被編譯器自動呼叫,如果我們不提供構造和析構,編譯器會提供編譯器提供的建構函式和析構函式是空實現。include using namespace std 物件的初始化和處理 class person pu...
類和物件(3) 物件的構造和析構
如果不用建構函式初始化,該怎麼辦 為每個類都提供乙個public的initialize函式 物件建立後立即呼叫initialize函式進行初始化。缺點1 initialize只是乙個普通的函式,必須顯示的呼叫 2 一旦由於失誤的原因,物件沒有初始化,那麼結果將是不確定的 沒有初始化的物件,其內部成員...
9 物件建立過程和多型
5.多型 重重之重 難點 4.物件建立的過程 了解 4.1單個物件建立的過程 成員變數 新的值 由結果可知優先順序如下 初始化方式 構造塊 構造方法 由結果可知優先順序如下 靜態 塊 構造塊 構造方法 4.2子類物件建立的過程 1 main 方法時程式的入口,當建立物件時會在堆區申請一塊儲存區域 2...