天天看點

C++中 explicit的用法

explicit 是避免構造函數的參數自動轉換為類對象的辨別符

#include <iostream> using namespace std;

class A

{

public:

explicit A(int a){

cout<<“建立類成功了!”<<endl; }

};

int main()

{

A a=10;

return 0;

}

上面的代碼編譯不成功,原因是當顯式地定義了一個帶一個參數的構造函數( 帶explicit),必須要顯示地調用構造函數,

A a(10);

如果不加 explicit的話

A a=10;

實際的轉換過程如下:

相當于直接調用A(10);

(1)

explicit

此關鍵字隻能對使用者自己定義的對象起作用,不對預設構造函數起作用

此關鍵字隻能夠修飾構造函數。而且構造函數的參數隻能有一個。。

(2)何時用explicit

當我們不希望自動類型轉換的時候用,其實标準庫好多構造函數都是explicit的

比如說vector <int> ivec(10);  //這種定義看起來一目了然

不能寫成vector <int> ivec=10;//此種定義讓程式員感到疑惑

(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;

明白隐式轉換在我們自己寫類的時候,尤其是些操縱記憶體的類的時候很有用。

explicit 是避免構造函數的參數自動轉換為類對象的辨別符

#include <iostream> using namespace std;

繼續閱讀