建構函式與析構函式

2021-10-04 18:06:48 字數 3572 閱讀 6121

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 物件...