C++中允許一種特殊的聲明比變量的方式。在這種情況下,可以將一個對應於構造函數參數類型的數據直接賦值給類變量。編譯器在編譯時會自動進行類轉換,將對應於構造函數參數類型的數據轉換爲類的對象。但是這種寬鬆的規則會破壞代碼的可讀性,並導致難以發現的錯誤。其實只要在構造函數前加上explicit則會禁止這種自動轉換。要注意的是explicit只對構造函數起作用。
下面來舉例說明。
#include<iostream>
using namespace std;
class Test
{
public:
Test(int x=1):val(x){}
int GetVal(void){return val;}
private:
int val;
};
main()
{
Test t1(1);
cout<<"t1.val="<<t1.GetVal()<<endl;
Test t2=2;
cout<<"t1.val="<<t2.GetVal()<<endl;
}
在以上代碼中我們發現可以把數字“2”直接發給Test類型的對象t2。這就是c++編譯器隱式轉換的結果。
然後我們在構造函數之前加上explicit:
#include<iostream>
using namespace std;
class Test
{
public:
explicit Test(int x=1):val(x){}
int GetVal(void){return val;}
private:
int val;
};
main()
{
Test t1(1);
cout<<"t1.val="<<t1.GetVal()<<endl;
Test t2=2;
cout<<"t1.val="<<t2.GetVal()<<endl;
}
編譯時會出現以下錯誤: