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。