C 了解建構函式和析構函式

2021-10-05 15:40:01 字數 2175 閱讀 7919

一般來說,每次都是建立乙個物件,再在類的公有函式裡設定資訊,那能不能在建立函式的同時設定資訊呢???

建構函式是乙個特殊的成員函式,主要作用是初始化物件的記憶體空間

雖然稱為建構函式,但是其核心並不是開空間建立物件,而是對物件記憶體空間的初始化。

(1)函式名與類名相同

(2)無返回值

(3)物件例項化時編譯器自動呼叫對應的建構函式

我們都知道類的成員方法(建構函式和析構函式)是依賴物件呼叫的,而建構函式是初始化物件所佔空間的,那就會造成這樣乙個問題:如果使用者能手動呼叫建構函式,那物件就要先生成,那物件要生成就要先呼叫建構函式,所以如果手動呼叫建構函式就會造成雞生蛋還是蛋生雞的問題???

所以建構函式是不能手動呼叫的,由編譯器自動呼叫。

(4)建構函式可以過載

建構函式是在對不同物件的記憶體空間進行初始化,而不同的物件就需要多個建構函式進行定義,所以建構函式是可以過載的。

(5)在物件的生命週期內只呼叫一次

(6)每個建構函式都有預設建構函式

如果類中沒有顯式定義建構函式,那麼c++編譯器會自動生成乙個預設建構函式,一般來說預設建構函式就是乙個什麼也沒有的函式。同時無參或者預設的建構函式也稱為預設建構函式。但是如果已經定義了建構函式,編譯器就不會在生成預設建構函式。

那麼就有人問了:那既然什麼也沒有,那執行後也就是隨機值,那預設建構函式有什麼用???

原因是:

在c++中,把型別分成了基本型別和自定義型別。

基本型別就是語法已經定義好的型別,例如:int、char等。

自定義型別是使用者使用class / struct / union 自行定義的型別。

當使用者自定義型別成員時,預設建構函式就會對它呼叫它的預設建構函式。擁有預設建構函式後,可以宣告物件,而不初始化它。

class

time

private

:int _hour;

int _minute;

int _second;};

class

date

;int

main()

析構函式不是完成物件的銷毀,區域性物件的銷毀是由編譯器完成的,而物件在銷毀時自動呼叫析構函式完成類的資源清理工作。

所以析構函式主要工作是釋放物件所佔資源的

(1)析構函式是在類名前加上 ~

(2)無引數無返回值

(3)乙個類只有乙個析構函式,即析構函式不能過載

(4)物件生命週期結束時,c++編譯器會自動呼叫預設析構函式,使用者也可以手動呼叫,但一般不建議。

原因是:

在析構函式呼叫前,物件已經生成,如果使用者手動呼叫析構函式後,它就變成了乙個普通的成員方法,而普通的成員方法只是把物件所佔資源釋放了,但物件依然存在當物件生成週期到了之後,系統還會呼叫一次析構函式來釋放資源,那就導致同一塊記憶體被釋放了兩次

所以析構函式可以手動釋放,但是不建議。

class

cgoods

~cgoods()

private

:char

* _name;

float _price;

int _amount;};

intmain()

1、在進行指標的初始化時,不能直接寫成_name = name,如果寫成這樣就是字串進行直接賦值,那在實現時如果字串不等長,就會出錯。所以要進行動態開闢記憶體,c++用new。

2、物件生成時:

(1)物件開闢記憶體

(2)系統自動呼叫建構函式

3、物件釋放時:

(1)呼叫析構函式(釋放堆上所佔記憶體)

(2)釋放物件所佔記憶體

4、物件是在棧上開闢,而物件中new開闢的記憶體是在堆上

(1)棧上系統開闢,系統釋放、

(2)堆上使用者開闢,使用者釋放

C 建構函式和析構函式

1.建構函式是類的一種特殊方法,每次建立類的例項都會呼叫它。在建立乙個類的例項時,建構函式就像乙個方法一樣被呼叫,但不返回值。語法格式 訪問修飾符 類名 特性 1 其名字必須與類名相同,例如 public class myclass 2 不能被直接呼叫,必須通過new運算子來 呼叫。publiccl...

C 建構函式和析構函式

建構函式 class rectangel rectangel int l,int w 這是帶引數的建構函式,建構函式都是沒有返回值,並且和該類同名 int area 這是另一種形式的內聯函式,把宣告和定義寫在一起的也是內聯函式 private int length int width 析構函式 cl...

c 建構函式和析構函式

1.c 的建構函式有預設建構函式,一般的建構函式,賦值建構函式,拷貝建構函式 複製建構函式 強制型別轉化建構函式。2.如果沒有定義建構函式和析構函式,則c 編譯器會按照 位拷貝 的方式提供預設的建構函式 不初始化 預設的賦值建構函式 淺賦值 預設的拷貝建構函式 淺拷貝 預設的析構函式。位拷貝要小心指...