C 建構函式和析構函式

2021-07-10 02:42:39 字數 2778 閱讀 7011

一、建構函式的介紹

1. 建構函式的作用

建構函式主要用來在建立物件時完成對物件屬性的一些初始化等操作, 當建立物件時, 物件會自動呼叫它的建構函式。一般來說, 建構函式有以下三個方面的作用:

■ 給建立的物件建立乙個識別符號;

■ 為物件資料成員開闢記憶體空間;

■ 完成物件資料成員的初始化。

2. 預設建構函式

當使用者沒有顯式的去定義建構函式時, 編譯器會為類生成乙個預設的建構函式, 稱為 "預設建構函式", 預設建構函式不能完成物件資料成員的初始化, 只能給物件建立一識別符號, 並為物件中的資料成員開闢一定的記憶體空間。

3. 建構函式的特點

無論是使用者自定義的建構函式還是預設建構函式都主要有以下特點:

①. 在物件被建立時自動執行;

②. 建構函式的函式名與類名相同;

③. 沒有返回值型別、也沒有返回值;

④. 建構函式不能被顯式呼叫。

二、建構函式的顯式定義

由於在大多數情況下我們希望在物件建立時就完成一些對成員屬性的初始化等工作, 而預設建構函式無法滿足我們的要求, 所以我們需要顯式定義乙個建構函式來覆蓋掉預設建構函式以便來完成必要的初始化工作, 當使用者自定義建構函式後編譯器就不會再為物件生成預設建構函式。

在建構函式的特點中我們看到, 建構函式的名稱必須與類名相同, 並且沒有返回值型別和返回值, 看乙個建構函式的定義:

1    #include 2

3 using namespace std;

4 5 class point

6

14 void printpoint()

15

14 void printpoint()

15

point() //過載乙個無參建構函式

在上面的過載中, 當嘗試用 point 類過載乙個無引數傳入的物件 m 時, point m; 這時編譯器就報一條 error: call of overloaded 'point()' is ambiguous 的錯誤資訊來告訴我們說point 函式具有二義性, 這是因為point(int x = 0, int y = 0) 全部使用了預設引數, 即使我們不傳入引數也不會出現錯誤, 但是在過載時又過載了乙個不需要傳入引數了建構函式 point(), 這樣就造成了當建立物件都不傳入引數時編譯器就不知道到底該使用哪個建構函式了, 就造成了二義性。

四、初始化表示式

物件中的一些資料成員除了在建構函式體中進行初始化外還可以通過呼叫初始化表來進行完成, 要使用初始化表來對資料成員進行初始化時使用 : 號進行調出, 示例如下:

point(int x = 0, int y = 0):xpos(x), ypos(y)  //使用初始化表

在 point 建構函式頭的後面, 通過單個冒號 : 引出的就是初始化表, 初始化的內容為 point 類中int型的 xpos 成員和 ypos成員, 其效果和 xpos = x; ypos = y; 是相同的。

與在建構函式體內進行初始化不同的是, 使用初始化表進行初始化是在建構函式被呼叫以前就完成的。每個成員在初始化表中只能出現一次, 並且初始化的順序不是取決於資料成員在初始化表中出現的順序, 而是取決於在類中宣告的順序。

此外, 一些通過建構函式無法進行初始化的資料型別可以使用初始化表進行初始化, 如: 常量成員和引用成員, 這部分內容將在後面進行詳細說明。使用初始化表對物件成員進行初始化的完整示例:

1 #include 2

3 using namespace std;

4 5 class point

6

1213 void printpoint()

14

14 ~book() //析構函式

15

19 void showname() {cout<<"book name: "<< bookname <

編譯執行的結果:

book name: c++ primer

析構函式被呼叫...

process returned 0 (0x0)  execution time : 0.266 s

press any key to continue.

**說明:

**中建立了乙個 book 類, 類的資料成員只有乙個字元指標型的 bookname, 在建立物件時系統會為該指標變數分配它所需記憶體, 但是此時該指標並沒有被初始化所以不會再為其分配其他多餘的記憶體單元。在建構函式中, 我們使用 new 申請了一塊 strlen(name)+1 大小的空間, 也就是比傳入進來的字串長度多1的空間, 目的是讓字元指標 bookname 指向它, 這樣才能正常儲存傳入的字串。

在 main 函式中使用 book 類建立了乙個物件 cpp,初始化 bookname 屬性為 "c++ primer"。從執行結果可以看到, 析構函式被呼叫了, 這時使用 new 所申請的空間就會被正常釋放。

自然狀態下物件何時將被銷毀取決於物件的生存週期, 例如全域性物件是在程式執行結束時被銷毀, 自動物件是在離開其作用域時被銷毀。 

如果需要顯式呼叫析構函式來釋放物件中動態申請的空間只需要使用物件名.析構函式名(); 即可, 例如上例中要顯式呼叫析構函式來釋放 bookname 所指向的空間只要:

cpp.~book();

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