explicit作用:
在C++中,explicit關鍵字用來修飾類的構造函數,被修飾的構造函數的類,不能發生相應的隱式類型轉換,只能以顯示的方式進行類型轉換。
explicit使用注意事項:
*
explicit 關鍵字只能用於類內部的構造函數聲明上。
*
explicit 關鍵字作用於單個參數的構造函數。
* 在C++中,explicit關鍵字用來修飾類的構造函數,被修飾的構造函數的類,不能發生相應的隱式類型轉換
例子:
未加explicit時的隱式類型轉換
class Circle { public: Circle(double r) : R(r) {} Circle(int x, int y = 0) : X(x), Y(y) {} Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {} private: double R; int X; int Y; }; int _tmain(int argc, _TCHAR* argv[]) { //發生隱式類型轉換 //編譯器會將它變成如下代碼 //tmp = Circle(1.23) //Circle A(tmp); //tmp.~Circle(); Circle A = 1.23; //注意是int型的,調用的是Circle(int x, int y = 0) //它雖然有2個參數,但后一個有默認值,任然能發生隱式轉換 Circle B = 123; //這個算隱式調用了拷貝構造函數 Circle C = A; return 0; }
加了explicit關鍵字后,可防止以上隱式類型轉換發生
class Circle { public: explicit Circle(double r) : R(r) {} explicit Circle(int x, int y = 0) : X(x), Y(y) {} explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {} private: double R; int X; int Y; }; int _tmain(int argc, _TCHAR* argv[]) { //一下3句,都會報錯 //Circle A = 1.23; //Circle B = 123; //Circle C = A; //只能用顯示的方式調用了 //未給拷貝構造函數加explicit之前可以這樣 Circle A = Circle(1.23); Circle B = Circle(123); Circle C = A; //給拷貝構造函數加了explicit后只能這樣了 Circle A(1.23); Circle B(123); Circle C(A); return 0; }
原文鏈接:http://www.cnblogs.com/this-543273659/archive/2011/08/02/2124596.html