1. 程式人生 > >C++中的explicit關鍵字

C++中的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關鍵字:

  1. class Circle  
   2. {  
   3. public:  
   4.     explicit Circle(double r) : R(r) {}  
   5.     explicit Circle(int x, int y = 0) : X(x), Y(y) {}  
   6.     explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}  
   7. private:  
   8.     double R;  
   9.     int    X;  
  10.     int    Y;  
  11. };  
  12.   
  13. int _tmain(int argc, _TCHAR* argv[])  
  14. {  
  15. 	//以下3句,都會報錯  
  16.     //Circle A = 1.23;   
  17.     //Circle B = 123;  
  18.     //Circle C = A;  
  19.       
  20. //只能用顯示的方式呼叫了  
  21. //未給拷貝建構函式加explicit之前可以這樣  
  22.          Circle A = Circle(1.23);  
  23.         Circle B = Circle(123);  
  24.         Circle C = A;  
  25.   
  26. //給拷貝建構函式加了explicit後只能這樣了  
  27.          Circle A(1.23);  
  28.         Circle B(123);  
  29.         Circle C(A);  
  30.     return 0;  
  31. }