程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++關鍵字explicit

c++關鍵字explicit

編輯:C++入門知識

c++關鍵字explicit

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

 
explicit,和構造函數一起使用.
explicit   constructor指明構造函數只能顯示使用,目的是為了防止不必要的隱式轉化.
舉個例子:
    有這樣一段代碼:

class   A
{
      public:
          A(int);
      private:
          int   num;
};

int   Test(const   A&)   //   一個應用函數
{
      ...
}

Test(2);   //   正確
過程是這樣的:   編譯器知道傳的值是int而函數需要的是A類型,但它也同時知道調用A的構造函數將int轉換成一個合適的A,所以才有上面成功的調用.換句話說,編譯器處理這個調用時的情形類似下面這樣:
    const   A   temp(2);             //   從2產生一個臨時A對象
    Test(temp);           //   調用函數


如果代碼寫成如下樣子:
class   A
{
      public:
        explicit   A(int);
      private:
          int   num;
};

int   Test(const   A&)   //   一個應用函數
{
      ...
}

Test(2);   //   失敗,不能通過隱式類型轉換將int類型變量構造成成A類型變量


 

作者 sdtarena

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved