C 建構函式和析構函式

2021-07-30 14:47:31 字數 1836 閱讀 3487



在c++中,有一種特殊的成員函式,它的名字和類名相同,沒有返回值,不需要使用者顯式呼叫(使用者也不能呼叫),而是在建立物件時自動執行。這種特殊的成員函式就是建構函式(constructor)。

建構函式必須是 public 屬性的,否則建立物件時無法呼叫。當然,設定為 private、protected 屬性也不會報錯,但是沒有意義。

建構函式

沒有返回值

,因為沒有變數來接收返回值,即使有也毫無用處,這意味著:

不管是宣告還是定義,函式名前面都不能出現返回值型別,即使是

void 也不允許;

函式體中

不能有 return 語句

和普通成員函式一樣,建構函式是允許過載的。乙個類可以有多個過載的建構函式,建立物件時根據傳遞的實參來判斷呼叫哪乙個建構函式。

建構函式的呼叫是強制性的,一旦在類中定義了建構函式,那麼建立物件時就一定要呼叫,不呼叫是錯誤的。如果有多個過載的建構函式,那麼建立物件時提供的實參必須和其中的乙個建構函式匹配;反過來說,建立物件時只有乙個建構函式會被呼叫。

如果使用者自己沒有定義建構函式,那麼編譯器會自動生成乙個預設的建構函式,只是這個建構函式的函式體是空的,也沒有形參,也不執行任何操作。

乙個類必須有建構函式

,要麼使用者自己定義,要麼編譯器自動生成。一旦使用者自己定義了建構函式,不管有幾個,也不管形參如何,編譯器都不再自動生成

v實際上編譯器只有在必要的時候才會生成預設建構函式,而且它的函式體一般不為空。預設建構函式的目的是幫助編譯器做初始化工作,而不是幫助程式設計師。這是c++的內部實現機制,這裡不再深究,初學者可以按照上面說的「一定有乙個空函式體的預設建構函式」來理解。最後需要注意的一點是,呼叫沒有引數的建構函式也可以省略括號

建構函式的一項重要功能是對成員變數進行初始化,為了達到這個目的,可以在建構函式的函式體中對成員變數一一賦值,還可以採用引數初始化表。使用建構函式進行初始化並不會提高多少效率但使得**簡單明瞭。成員初始化的順序只和成員在類中宣告順序有關。

引數初始化表還有乙個很重要的作用,那就是初始化 const 成員變數。初始化 const 成員變數的唯一方法就是使用引數初始化表

建物件時系統會自動呼叫建構函式進行初始化工作,同樣,銷毀物件時系統也會自動呼叫乙個函式來進行清理工作,例如釋放分配的記憶體、關閉開啟的檔案等,這個函式就是析構函式。

析構函式(destructor)也是一種特殊的成員函式,沒有返回值,不需要程式設計師顯式呼叫(程式設計師也沒法顯式呼叫),而是在銷毀物件時自動執行。建構函式的名字和類名相同,而析構函式的名字是在類名前面加乙個~符號。

注意:析構函式沒有引數,不能被過載,因此乙個類只能有乙個析構函式。如果使用者沒有定義,編譯器會自動生成乙個預設的析構函式。

函式名是識別符號的一種,原則上識別符號的命名中不允許出現~符號,在析構函式的名字中出現的~可以認為是一種特殊情況,目的是為了和建構函式的名字加以對比和區分。

vc++ 中的 new 和 delete 分別用來分配和釋放記憶體,它們與c語言中 malloc()、free() 最大的乙個不同之處在於:用 new 分配記憶體時會呼叫

建構函式

,用 delete 釋放記憶體時會呼叫

析構函式

。建構函式和析構函式對於類來說是不可或缺的,所以在c++中我們非常鼓勵使用 new 和 delete。

析構函式在物件被銷毀時呼叫,而物件的銷毀時機與它所在的記憶體區域有關。

在所有函式之外建立的物件是全域性物件,它和全域性變數類似,位於記憶體分割槽中的全域性資料區,程式在結束執行時會呼叫這些物件的析構函式。

在函式內部建立的物件是區域性物件,它和區域性變數類似,位於棧區,函式執行結束時會呼叫這些物件的析構函式。

new 建立的物件位於堆區,通過 delete 刪除時才會呼叫析構函式;如果沒有 delete,析構函式就不會被執行。

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 編譯器會按照 位拷貝 的方式提供預設的建構函式 不初始化 預設的賦值建構函式 淺賦值 預設的拷貝建構函式 淺拷貝 預設的析構函式。位拷貝要小心指...