[轉]C++ explicit的做用

explicit做用:html

在C++中,explicit關鍵字用來修飾類的構造函數,被修飾的構造函數的類,不能發生相應的隱式類型轉換,只能以顯示的方式進行類型轉換。函數

explicit使用注意事項:this

    *htm

      explicit 關鍵字只能用於類內部的構造函數聲明上。blog

    *ci

      explicit 關鍵字做用於單個參數的構造函數。編譯器

    * 在C++中,explicit關鍵字用來修飾類的構造函數,被修飾的構造函數的類,不能發生相應的隱式類型轉換it

例子:編譯

未加explicit時的隱式類型轉換class

   1. class Circle  
   2. {  
   3. public:  
   4.     Circle(double r) : R(r) {}  
   5.     Circle(int x, int y = 0) : X(x), Y(y) {}  
   6.     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. //發生隱式類型轉換  
  16. //編譯器會將它變成以下代碼  
  17. //tmp = Circle(1.23)  
  18. //Circle A(tmp);  
  19. //tmp.~Circle();  
  20.     Circle A = 1.23;   
  21. //注意是int型的,調用的是Circle(int x, int y = 0)  
  22. //它雖然有2個參數,但後一個有默認值,任然能發生隱式轉換  
  23.     Circle B = 123;  
  24. //這個算隱式調用了拷貝構造函數  
  25.     Circle C = A;  
  26.       
  27.     return 0;  
  28. } 

加了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. } 

參考http://www.cnblogs.com/this-543273659/archive/2011/08/02/2124596.html

相關文章
相關標籤/搜索