C++ 中explicit的作用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM