前陣在看muduo原始碼的時候,發現很多建構函式用到了explicit
關鍵字,坐了一天的火車今天剛好沒事花一點時間稍微看了一蛤。
首先,這個explicit關鍵字針對的場景是只有乙個引數的建構函式
,因為這樣的建構函式除了是乙個構造器以外,還有乙個預設的隱式型別轉換——形參型別到類型別的隱式轉換。
看乙個例子:
#include
using
namespace
std;
class foo
int getfoo()
private:
int m_foo;
};int dofoo(foo f)
int main(int argc, char**argv)
上述main函式中,雖然在呼叫dofoo()
函式時,實參不是foo
型別而是int
型別,但是foo
類中包含了單個int
型別的引數的建構函式,因此,此時建構函式就可以用來將實參轉換成合適的型別。
而explicit
關鍵字,正是阻止這種隱式轉換行為,比如說,當我們將建構函式的定義前加上該關鍵字:
explicit foo(int foo) : m_foo(foo)
此時,main函式中將會出現error:
int i = dofoo(42);//error:不存在int轉換到foo的適當建構函式。
這個時候,我們只能做如下呼叫:
int i = dofoo(foo(42));
也就是說,我們必須顯示地去呼叫建構函式。
那麼,這個關鍵字有什麼用呢,舉個例子:
比如說,有乙個建構函式mystring::mystring(int size)
,用來構造特定大小的字串;而還有乙個函式print(mystring &)
,當你呼叫print(3)
時,你可能是想要列印字串」3」,而實際上,卻列印了乙個大小為3的空串。
note:
1.2.
3.effective c++
explicit建構函式
按照預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件,如下面所示 class string string s1 hello ok 隱式轉換,等價於string s1 string hello 但是有的時候可能會不需要這種隱式轉換,如下 class s...
explicit建構函式
在閱讀slicer原始碼時,遇見explicit修飾的建構函式,比較迷惑 explicit qslicerigsreadermodule qobject parent 0 下面就解釋這個問題。按照預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件,如下...
C 關鍵字之explicit與轉換建構函式
首先,c 中的explicit關鍵字只能用於修飾只有乙個引數的類建構函式,它的作用是表明該建構函式是顯示的,而非隱式的,跟它相對應的另乙個關鍵字是implicit,意思是隱藏的,類建構函式預設情況下即宣告為implicit 隱式 那麼顯示宣告的建構函式和隱式宣告的有什麼區別呢?我們來看下面的例子 c...