天天看點

explicit關鍵字的用途

  explicit主要用于"修飾"構造函數.  

  使得它不用于程式中需要通過此構造函數進行"隐式"轉換的情況!  

  指定此關鍵字,需要隐式轉換方可進行的程式将會不能通過.  

  而可通過強制轉換使它沒有用.  

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類型變量  

再來一例:

是為了防止單參數的構造函數的隐式轉化。比如說有一個類   Rational   表示一個複數,如下:  

  class   Rational  

  {  

  public:  

          int   _x;  

          int   _y;  

          Rational(   int   x   =   0,int   y   =   0   )  

          {  

                _x   =   x;  

                _y   =   y;  

          }  

  };  

  void   printValue(const   Rational&   ra)  

  {  

          cout   <<   ra._x   <<   ra._y   <<endl;  

  }  

  如果是不用explicit   關鍵字,則象下邊的東西也是合法的:  

  int   x;  

  printValue(   x   );  

  如果用了explicit   關鍵字,這個是不合法的,我們一定要寫成如下格式:  

  printValue(   Rational(   x   )   )才成,這樣就避免了隐式轉化帶來的bug。

繼續閱讀