1類的建構函式
引例定義乙個型別:circle, 圓
成員:圓心座標(x,y),半徑radius
class circle;引例
定義乙個物件
circle a;
// 問題: 此時這個物件a算是乙個有效的物件嗎?
// 看看它的x,y,和radius,是亂的
那麼再給它賦值不就好了嗎?
a.x=0;
a.y=0;
a.radius = 1;
但是從「物件」的觀點來看,物件被建立之時,就應該是有效的,不應該存在「半 成品」物件。
比如說,一輛車car在造出來的時候,必須帶著輪子。如果沒有輪子,此時它還不能 稱為car。
引例如何讓乙個物件在被建立的時候,就賦予初始值。
方法是:建構函式
建構函式
建構函式是類的一種特殊的成員函式:
(1) 函式名與類名必須相同
(2) 沒有返回值
例如,class circle
};建構函式
建構函式可以帶引數,也可以過載
class circle
circle(int x, int y, int r)
};建構函式如何呼叫
建構函式和普通成員函式不一樣,一般不顯式呼叫。
在建立乙個物件時,建構函式被自動呼叫。(由編譯器完成)
例如,circle a;
circle b(1,1, 4);
它們在內部實質上是分別呼叫了不同的建構函式,但是表面 上沒有這個函式呼叫過程。
建構函式如何呼叫
建構函式的作用:物件一「出生」就是有效的。不存在「半 成品」物件。
它可以理解為「初始化」動作。
基本型別的初始化:
int a(10); // 將a初始化為10, 也可以寫成int a = 10;
student s=; // struct的初始化
現在,類class的初始化使用建構函式的方式。
小結介紹建構函式的語法:名字與類名相同,沒有返回值
建構函式的作用:用於初始化物件
建構函式的呼叫:建立物件的同時,被編譯器自動呼叫。
建構函式也可以過載。
2類的析構函式
析構函式
析構和構造是一對相反的過程。
建構函式:物件被建立時補呼叫
析構函式:物件被銷毀時被呼叫
析:分崩離析
英文:建構函式 constructor 析構函式destructor
析構函式
析構函式也不是普通的函式
(1) 名稱固定:類名前加上波浪線~
(2) 沒有返回值
(3) 不能帶引數
例如, class object
};注:析構函式只能有乙個,不允許過載
析構函式如何呼叫?
析構函式從不顯式地呼叫,而是被編譯器自動地呼叫。
什麼時候被呼叫?物件被銷毀之時
。
對於區域性變數(物件),在超出變數作用域後,該物件失效 (關於區域性變數的作用域,在第8章)
析構函式如何呼叫?
int main()
// obj失效 return 0; }
析構函式如何呼叫?
void test()
// obj失效
int main()
析構函式的作用
析構函式:物件在銷毀之前,做乙個清理善後工作。
比如,申請來的記憶體要釋放掉,開啟的檔案file*要關閉 掉。。
析構函式的作用
例如,class stringbuffer
~stringbuffer()
};析構函式的作用
例如,class datastore
~datastore()
private:
student m_head;
};.h/.cpp 分離式寫法
分開寫在.h和.cpp裡時,規則和普通函式一樣
class datastore
;datastore::datastore() // 函式定義,要加類名字首
datastore:: ~datastore()
3再說構造與析構
內容提要
預設建構函式
成員的構造與析構順序
成員的初始化列表
預設建構函式
把那種不需要傳參的建構函式
,稱為預設建構函式。
例如,object();
或者建構函式的所有引數都有預設值,也稱為預設建構函式
object(int a=10, int b=11);
(函式預設值的語法參考第8章)
有了預設建構函式之後,物件在構造時就可以不傳遞引數。
例如, object obj;
預設建構函式
預設建構函式很重要。如果乙個類沒有預設建構函式,則無法構 造陣列。
例如,class object
};object objs[4]; // 錯誤!
所以,一般都要給類定義乙個預設構造引數,以方便使用。
沒寫建構函式?沒寫析構函式?
如果乙個類沒有寫任何建構函式,則編譯器隱含地生成為其新增 乙個,相當於
// 相當於新增了
object::object()
如果沒寫析構函式,則編譯器隱含地生成乙個析構函式 相當於新增了
object::~object()
(注意:只有當你沒有寫建構函式的時候,才給隱含地加乙個構 造函式。一旦你寫了乙個建構函式,它就不給你加了)
成員的初始化與析構
考慮成員變數本身也是 class型別的情況:
當物件被構造時,成員變數也被構造(成員變數的構造 函式被呼叫)
當物件被析構時,成員變數也被析構(成員變數的析構 函式被呼叫)
成員的初始化與析構
結論:一、構造的時候
(1)成員被依次構造: 從前到後
(2)先執行成員的建構函式,再執行自己的建構函式
二、析構的時候
(1)成員被依次析構: 從後到前
(2)先執行自己的析構函式,再執行成員的析構
初始化列表
可以在建構函式後面直接初始化
(1)以冒號引導
(2)使用小括號來初始化
初始化列表
(1)基本型別的初始化
class object
};初始化列表
(2) class型別的初始化
用小括號帶上構造引數
class object
};初始化列表
"初始化"與"賦值"有何區別?
(1)功能上:一樣
(2)效能上:"初始化"相對較好,有時可以節省cpu操作
class object
};
小結預設建構函式:不需要傳參的建構函式 這個非常必要,一般的類都要提供一下預設建構函式
構造與析構的順序問題
初始化列表 在建構函式的位置指定成員的初始化構造引數
學習資源《c語言/c++學習指南》語法篇(從入門到精通)》
建構函式與析構函式
建構函式 主要作用就是為物件初始化。有一點要說的是,在繼承體系彙總,如果在建構函式中,如果沒有指定基類的建構函式,那麼編譯器會在建構函式開頭加入,基類的預設建構函式,這樣就可以初始化基類物件部分 析構函式 對於析構函式,要說的多點,實際也不太複雜,就是加入了virtual 使其具有了多型性質 inc...
建構函式與析構函式
建構函式 先看看建構函式的呼叫順序規則,只要我們在平時程式設計的時候遵守這種約定,任何關於建構函式的呼叫問題都能解決 建構函式的呼叫順序總是如下 1.基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序,而不是它們在成員初始化表中的順序。2.成員類物件建構函式。如果有多個成...
建構函式與析構函式
概述 乙個類有兩種特殊的成員函式 建構函式與析構函式。建構函式功能是在建立物件時,給資料成員賦初值,即物件的初始化。析構函式的功能是釋放乙個物件,在物件刪除前,用它做一些記憶體釋放工作,與建構函式的功能相反。建構函式 在物件建立時它會被自動執行,因此變數 物件的初始化 一般都放在建構函式中。1 物件...