詳解 c 關鍵字 explicit

2021-10-02 09:31:19 字數 2145 閱讀 1321

用了很久的c++ 了,今天突然被小夥伴問道,建構函式前的explicit 關鍵字什麼作用,於是自己也只能支支吾吾的說出「為了顯式呼叫……」很尷尬啊……典型的知道所以然不知道其所以然……好吧,搜搜資料好好地充充電……

首先說定義,c++ 中的explicit關鍵字只能用於修飾只有乙個引數的類建構函式,它的作用是表明該建構函式是顯式的,而非隱式的。跟他對應的另乙個關鍵字是implicit,意思是隱藏的,類建構函式預設情況下就是宣告為implicit(隱式的)。

這裡的重點就是 只能 修飾 只有乙個引數的 類的建構函式。也就是說,

一、只可以修飾類的建構函式,一般的函式不能修飾。

二、只有類的建構函式有乙個引數時候,才有效,當有多個引數時候就沒什麼意義了(這裡有個例外,就是當除了第乙個引數以外的其他引數都有預設值的時候,explicit依然有效,此時呼叫建構函式時只傳入乙個引數,等效於只有乙個引數的類建構函式)。

我們先來看看什麼是顯式呼叫,什麼是隱式呼叫:

myclass(int size, const char *pstr) //引數為兩個,所以不管是否使用explicit關鍵字,都是無效的。

};下面是呼叫:

myclass c1(10);         // ok, 顯式呼叫 myclass(int size)

myclass c2 = 12; // ok, 隱式呼叫 myclass(int size)

myclass c3; // 錯誤, 沒有響應的建構函式

myclass c4("hello"); // ok, 顯式呼叫 myclass(const char *pstr)

myclass c5 = "nihao"; // ok, 隱式呼叫

myclass c6(5, "hello"); // ok, 顯式呼叫 myclass(int size, const char *pstr)

c1 = 5; // ok, 隱式呼叫 myclass(int size)

c2 = 6; // ok, 隱式呼叫 myclass(int size)

c4 = "hello world"; // ok, 隱式呼叫 myclass(const char *pstr)

c3 = c1; // 錯誤, 編譯是沒問題的,但是必須在類裡過載「=」運算子才行

上面** c2 = 12; c5 = "nihao"為什麼是可以的呢?

因為在c++中,如果構造函只有乙個引數時,那麼編譯的時候就會有乙個預設的轉換操作:將該建構函式對應的資料型別的資料轉換為該類物件。

也就是說myclass c2 = 12;等同於myclass c2(12);

但是上面的**中的myclass c2(12),中12表示分配記憶體大小,那麼c2 = 12 與5 = "nihao"這樣的隱式轉換顯得不倫不類,容易被誤解,怎麼避免使用這樣的隱式轉換呢?答案就是使用關鍵字explicit,我們將類中的建構函式新增上explicit關鍵字試試:

class myclass

explicit myclass(const char *pstr)

explicit myclass(int size, const char *pstr)        //兩個引數,所以新增explicit是無效的。

};

再次編譯一下結果如下:

發現隱式呼叫的全部錯誤,這就是使用關鍵字explicit,顯式呼叫的效果。也就是說,關鍵字explicit的作用就是防止夠咱函式的隱式轉換。

上面也說過了,explicit關鍵字只對有乙個引數的類建構函式有效,如果函式的引數大於或者等於兩個時候,是不會產生隱式轉換的,所以explicit也就是無效的。乙個例外就是,當除了第乙個引數意外其他引數都有預設值的時候,explicit關鍵字依然有效,此時當呼叫建構函式時,只傳入乙個引數,等同於只有乙個引數的類建構函式。

explicit myclass(int size, const char *pstr = "hello")

上面這種情況,explicit也是有效的!

C 中explicit關鍵字詳解

展開 總結參考文獻 explicit關鍵字的作用 explicit關鍵字在寫程式時使用的次數較少,但是仔細觀察會發現,在c 標準庫中的相關類宣告中explicit出現的頻率是很高的,那麼explicit關鍵字到底有什麼作用呢?接下來我就為大家一一解答.explicit為清晰的 明確的之意.顧名思義,...

C 的explicit關鍵字

c 的explicit關鍵字 c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下面...

C 的explicit關鍵字

c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下面所示 class myclas...