C 建構函式explicit關鍵字

2021-07-16 04:44:00 字數 1203 閱讀 3266

前陣在看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...