建構函式 析構函式 虛函式與內聯函式的關係

2021-09-27 07:45:17 字數 1195 閱讀 5573

首先要掌握一點,建構函式、析構函式、虛函式可以宣告為內聯函式,這在語法上是正確的。

如下面**是正確的,因為inline同register一樣,只是個建議,編譯器並不一定真正的內聯,在語法上是沒有錯誤的

class a

inline ~a() {}

inline virtual void virtualfun() {}};

int main()

將建構函式和析構函式宣告為inline是沒有什麼意義的,需要思考的是建構函式、析構函式、虛函式被宣告為inline有意義嗎,或者說編譯器是否對這些函式真正內聯呢?

先來看建構函式和析構函式,參閱effective c++得知,將建構函式和析構函式宣告為inline是沒有什麼意義的,即編譯器並不真正對宣告為inline的構造和析構函式內聯,因為編譯器會在構造和析構函式中新增額外的操作(申請/釋放記憶體,構造/析構物件等),致使建構函式/析構函式並不像看上去的那麼精簡

函式的inline屬性是在編譯時確定的,然而,virtual的性質是在執行時確定的,檔案中的inline關鍵字只是對編譯器的建議,編譯器是否採納是編譯器的事情。對於inline函式,編譯器仍然將它編譯成乙個有位址的函式。

需要注意的幾點:

1.虛函式可以是內聯函式,內聯是可以修飾虛函式的,但是當虛函式表現多型性的時候不能內聯。

2.內聯是在編譯器建議編譯器內聯,而虛函式的多型性在執行期,編譯器無法知道執行期呼叫哪個**,因此虛函式表現為多型性時(執行期)不可以內聯。

3.inline virtual 唯一可以內聯的時候是:編譯器知道所呼叫的物件是哪個類(如 base::who()),這只有在編譯器具有實際物件而不是物件的指標或引用時才會發生

#include using namespace std;

// 基類

class base

virtual ~base(){}

}; // 派生類

class derived:public base

};int main()

參考:

建構函式 析構函式 虛析構函式

說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...

虛函式與建構函式 析構函式

虛函式是多型的基礎 ps多型是乙個介面多個實現 多型條件 1.繼承 2.虛函式 3.父類指標指向子類 include using namespace std class myclass virtual void go1 virtual void go2 class classx public myc...

建構函式 析構函式 虛函式

在類中,建構函式用於初始化物件及相關操作。建構函式是不能宣告為虛函式的,因為虛函式對應乙個virtual table 虛函式表 這個表的位址是儲存在物件的記憶體空間的。而在執行建構函式前,物件尚未完成建立,記憶體都沒有被分配,所以無法去查詢虛函式表,它不存在,因此也就無法得知該呼叫哪乙個函式了。析構...