c++ 中explicit的作用

1、explicit作用

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

explicit使用注意事項:

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

  explicit 關鍵字作用於單個參數的構造函數。

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

例子:

  未加explicit時的隱式類型轉換

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章