天天看點

C++中explicit構造函數

隻能被顯式調用。 explicit構造函數是用來防止隐式轉換的。請看下面的代碼:

class Test1{

public:

Test1(int n){num=n;}//普通構造函數

private:

int num;



};
class Test2{

public:

explicit Test2(int n){num=n;}//explicit(顯式)構造函數

private:

int num;

};



int main() {

Test1 t1=12;//隐式調用其構造函數,成功

Test2 t2=12;//編譯錯誤,不能隐式調用其構造函數

Test2 t2(12);//顯式調用成功

return 0;

}      

Test1的構造函數帶一個int型的參數,代碼23行會隐式轉換成調用Test1的這個構造函數。而Test2的構造函數被聲明為explicit(顯式),這表示不能通過隐式轉換來調用這個構造函數,是以代碼24行會出現編譯錯誤。

普通構造函數能夠被隐式調用。而explicit構造函數隻能被顯式調用。發生隐式轉換,除非有心利用,隐式轉換常常帶來程式邏輯的錯誤,而且這種錯誤一旦發生是很難察覺的。

繼續閱讀