語言基礎(6) 關鍵字explicit

2022-08-13 18:18:17 字數 2252 閱讀 5194

c++中 explicit 被用來修飾只有乙個引數的建構函式,作用是呼叫該建構函式必須是顯示的(且要求只能放在函式宣告處), 跟它相對應的單詞是 implicit(隱含的、不言明的), 類建構函式預設情況下即宣告為 implicit (因此c++沒有此關鍵字)。

如果不使用該關鍵字,呼叫只有乙個引數的建構函式允許通過預設的轉換操作完成,過程可能通過如下兩步執行(vs2017驗證不是):

通過乙個例子來說明 explicit 作用:

class string;

string s1 = 'a'; // 錯誤:不能做隱式char->string轉換

string s2(10);   // 可以:呼叫explicit string(int n);

string s3 = string(10); // 可以:呼叫explicit string(int n);再呼叫預設的複製建構函式

string s4 = "brian"; // 可以:隱式轉換呼叫string(const char *p);再呼叫預設的複製建構函式

string s5("fawlty"); // 可以:正常呼叫string(const char *p);

void f(string);

string g()

#2、例外的情況

前面說過,該引數只對有乙個引數的建構函式有效,對於無引數和多個引數的建構函式,因為他們只能通過顯示呼叫,所以使用 explicit 沒有任何意義,但也存在例外情況,如下**:

```// example.h

#pragma once

class cexample

;// example.cpp

cexample::cexample(void): m_ifirst(0)

cexample::~cexample(void)

cexample::cexample(int ifirst, int isecond):m_ifirst(ifirst), m_isecond(isecond)

...//其它標頭檔案

int main()

如果在建構函式宣告中加入關鍵字explicit,如下:

`explicit cexample(int ifirst, int isecond = 0);`

那麼 cexample objfour = 12; 這條語句將不能通過編譯。在vs下的編譯錯誤提示如下:

error c2440: 'initializing' : cannot convert from 'int' to 'cexample'

constructor for class 'cexample' is declared 'explicit'

#3、何時不用explicit

當我們需要隱式轉換的時候,比如說string類的乙個建構函式:

`string(const char*);`

定義成這樣的好處,在需要隱式轉化的時候編譯器會自動地幫我們轉換,標準庫裡面的string就是乙個好的證明。具體來說:

我們可以這樣

string str="helloworld"; // 直接呼叫建構函式

string str="hello"+str+"world";

// 呼叫過載的+操作符號,此過程相當於:

string temp("hello"); // 呼叫建構函式

string str=temp+str;

string t("world"); // 呼叫建構函式

string str=str+t;

#總結1. explicit關鍵字只需用於類內的單引數建構函式前面,由於無引數的建構函式和多引數的建構函式總是顯示呼叫,這種情況在建構函式前加explicit無意義;

2. google的c++規範中提到explicit的優點是可以避免不合時宜的型別變換,缺點無。所以google約定所有單引數的建構函式都必須是顯示的,只有極少數情況下拷貝建構函式可以不宣告稱explicit (例如作為其他類的透明包裝器的類或者需要隱式轉換的情況);

3. effective c++中說:被宣告為explicit的建構函式通常比其non-explicit兄弟更受歡迎。因為它們禁止編譯器執行非預期(往往也不被期望)的型別轉換。除非我有乙個好理由允許建構函式被用於隱式型別轉換,否則我會把它宣告為explicit,鼓勵大家遵循相同的政策;

go語言基礎 關鍵字

定義 被程式語言保留而不讓程式設計人員作為識別符號使用的字串行,也可以稱為保留字 go語言中的關鍵字 go語言關鍵共計25個 chan func inte ce map和struct用來宣告和定義go語言的復合資料型別,分別與go語言的復合資料型別channel 通道 function 函式 int...

new關鍵字 this關鍵字 base關鍵字

使用new,所做的三件事 1.類是引用物件,引用物件是在堆中開闢空間 在堆中開闢空間 2.在開闢的堆空間中建立物件 3.呼叫物件的構建函式 4.隱藏父類成員 子類的成員可以與隱藏從父類繼承的成員,類似於重寫。public new void sayhello this關鍵字的使用 1.代表當前類的物件...

java基礎 this關鍵字

一 使用場景 1 在乙個構造方法中,通過this關鍵字呼叫所在類中的另乙個構造方法。2 在乙個例項方法內,區域性變數或引數與例項變數名稱相同,編譯口器無法區分變數,這時要用this關鍵字。3 在乙個例項方法內,通過this關鍵字訪問當前例項的引用。二 舉例說明 this關鍵字 1 出現在方法中 2 ...