C 中建構函式居然是可以直接呼叫的

2021-08-08 11:35:03 字數 1076 閱讀 6163

**如下

#include 

class

a a(int x):a(x),b(x+1)

~a()

int geta()

int getb()

private:

int a;

int b;

};int main()

經過編譯和執行之後,結果如下:

呼叫第乙個建構函式 

呼叫第二個建構函式 

呼叫析構函式 

5 6 

呼叫析構函式

首先要知道: 

一、c++編譯器可以在沒有拷貝建構函式和operator=這兩個函式的時候可以自動的生成這兩個函式。 

二、這兩個函式只能是由按位拷貝的語義,因此是淺拷貝,當有指標成員的時候,它只能拷貝指標的數值,而不能拷貝指標指向的內容。因此這兩個函式僅僅在某些特定的情況下才可能有效的發揮作用。

**分析: 

在宣告test的時候,呼叫了第乙個建構函式,然後在執行到test=a(5)的時候,呼叫了第二個建構函式,重點就在這裡,這裡不是test呼叫了第二個建構函式,實際是編譯器生成了乙個臨時物件,是這個臨時物件呼叫了第二個建構函式。前面提到了,在沒有自己寫拷貝建構函式和operator=這兩個函式的時候,編譯器會自動生成,這個時候的拷貝都是淺拷貝,編譯器執行a(5)的時候建立了乙個臨時的物件,然後通過編譯器自己生成的operator=函式把這個臨時物件的值賦給了test,最後析構這個臨時物件。

這裡有個值得注意的地方就是這種採用預設拷貝構造和operator=的拷貝和賦值都是淺拷貝,當有指標的時候應當特別注意不能這樣使用,容易出現問題。 

還有就是這中直接呼叫建構函式的方式,還有可能造成野指標,例如:

a* ptr = &a(5);
在臨時物件消失之後,ptr成為了野指標。

如果想要延長臨時物件生存週期,有一種方法是對它進行const引用:

const a& a = a(5);
這樣只要a存在,由a(5)產生的臨時物件就會存在。

C 中建構函式居然是可以直接呼叫的

如下 include class a a int x a x b x 1 a int geta int getb private int a int b int main 經過編譯和執行之後,結果如下 呼叫第乙個建構函式 呼叫第二個建構函式 呼叫析構函式 5 6 呼叫析構函式 首先要知道 一 c 編...

建構函式中是否可以呼叫虛函式

從語法上講,呼叫完全沒有問題。但是從效果上看,往往不能達到需要的目的。effective 的解釋是 派生類物件構造期間進入基類的建構函式時,物件型別變成了基類型別,而不是派生類型別。同樣,進入基類析構函式時,物件也是基類型別。所以,虛函式始終僅僅呼叫基類的虛函式 如果是基類呼叫虛函式 不能達到多型的...

C 中構造函式呼叫建構函式

include include using namespace std struct cls cls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體 非靜態資料成員是未初始化的 2 ...