C 知識梳理 建構函式和析構函式

2021-10-25 09:27:46 字數 2043 閱讀 2304

類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。

建構函式的名稱與類的名稱是完全相同的,並且不會返回任何型別,也不會返回 void。建構函式可用於為某些成員變數設定初始值。

對於建構函式有以下幾點需要注意:

c++ 預設建構函式是對類中的引數提供預設值的建構函式,一般情況下,是乙個沒有引數值的空函式。當沒有顯示宣告建構函式的時候,編譯器會隱式生成乙個預設建構函式,並且這個建構函式什麼都不會做。如果在類中顯示申明建構函式,編譯器將不會隱式生成預設建構函式。預設建構函式初始化規則如下:

#include

using namespace std;

class point

;//point::point()

// 最後,會發現成員變數x,y都沒有被初始化。和現實宣告預設成員函式,但是什麼操作都不做是一樣的。當顯示宣告建構函式之後,編譯器將不會隱式生成預設建構函式

在下面幾種情況中,預設建構函式是不適用的。

1.編譯器只有在發現類沒有宣告任何建構函式才會生成乙個預設建構函式。例如如下宣告:

class point

;point::point(int x,int y)

point a;

2.對於類中包含內建型別或者復合型別(陣列或者指標)成員,只有當這些成員全部被賦予了類內的初始值,這個類才適合使用預設建構函式。

暫時還沒有搞懂。。

3.編譯器不能為某些類合成預設建構函式。例如類中包含其他類型別成員,而這個成員沒有預設建構函式。

class a

~a(){};

private:

int x;

};class b

;在b的成員中,需要呼叫a的預設建構函式,但是由於a中沒有預設建構函式。

建構函式初始化列表是以乙個冒號開始,然後用逗號分隔資料列表。形如:

class myclass

~myclass(){}

private:    

int a;

int b;

int c;

};當某個資料成員被建構函式初始化列表忽略,會被預設建構函式隱式初始化。

建構函式不能夠輕易覆蓋類內的初始值,除非新賦值與原值不同。如果不能使用類內初值,應該顯示初始化每個內建型別成員。

必須使用建構函式初始化列表的情況

如果成員是const,引用、或者屬於某種未提供建構函式的類型別,我們必須通過過早函式初始化列表對其進行初始化。

例如:class constref

;此時必須將ci和ri初始化,如果採用下述方法

constref::constref(int ii)

正確的做法是採用初始化列表

constref::constref(int ii):i(ii),ci(ii),ri(i){}
此時的初始化順序實際上是a,b,c。而不是c,a,b。

因此最好令建構函式成初始值順序與成員的宣告順序保持一致,如果可能,盡量避免使用成員初始化其他成員。

析構函式是一類特殊的成員函式,它會在每次刪除所建行物件執行。

析構函式具有如下特點:

當物件超出範圍或被刪除時,其完整析構中的事件序列如下所示:

1.將呼叫該類的析構函式,並且會執行該析構函式的主體。

2.按照非靜態成員物件的析構函式在類宣告中的顯示順序的相反順序呼叫這些函式。 用於這些成員的構造的可選成員優化列表不影響構造或析構的順序。 (有關初始化成員的詳細資訊,請參閱初始化基和成員。)

3.非虛擬基類的析構函式以宣告的相反順序被呼叫。

4.虛擬基類的析構函式以宣告的相反順序被呼叫。

通過下面一段**可以看出,建構函式和析構函式的執行順序是相反的,當然,裡面涉及到了函式的繼承問題。

#include

using namespace std;

class a

提乙個常見誤區:struct和class的區別不是struct只能包含資料成員,而是許可權的問題,class預設訪問許可權是private,而struct預設訪問許可權是public。

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