用了很久的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...