C++ 語言可以定義如何将其他類型的對象隐式轉換為我們的類類型, 或将我們的類類型的對象隐式轉換為其他類型。
下面為類類型的隐式轉換的示例代碼:
#include <iostream>
using namespace std;
class A
{
public:
A(int temp) //普通構造函數
{
a = temp;
cout << "普通構造函數: a= " << a << endl;
}
A(const A &temp) //拷貝構造函數
{
a = temp.a;
cout << "拷貝構造函數: a = " << a << endl;
}
private:
int a;
};
int main()
{
cout << "顯示調用:" << endl;
A a(250); //顯式調用調用普通構造函數,ok
A b(a); //顯式調用調用拷貝構造函數,ok
cout << "\n隐式轉換:" << endl;
A c=222; //隐式轉換成調用普通構造函數,ok
A d=c; //隐式轉換成調用拷貝構造函數,ok
return 0;
}
編譯運作結果如下:
如果要避免這種自動轉換的功能,我們該怎麼做呢?C++提供了關鍵字explicit,可以阻止不應該允許的經過轉換構造函數進行的隐式轉換的發生。
c++中的explicit關鍵字抑制由構造函數定義的隐式轉換。explicit關鍵字隻能用于類内部的構造函數聲明上。在類的定義體外部所做的定義上不要加explicit關鍵字。
示例代碼如下:
#include <iostream>
using namespace std;
class A
{
public:
explicit A(int temp) //普通構造函數,被聲明為explicit(顯式)
{
a = temp;
cout << "普通構造函數: a= " << a << endl;
}
explicit A(const A &temp) //拷貝構造函數,被聲明為explicit(顯式)
{
a = temp.a;
cout << "拷貝構造函數: a = " << a << endl;
}
private:
int a;
};
int main()
{
cout << "顯示調用:" << endl;
A a(250); //顯式調用調用普通構造函數,ok
A b(a); //顯式調用調用拷貝構造函數,ok
//explicit構造函數隻能被顯式調用
A c=222; //不能通過隐式轉換,error
A d=c; //不能通過隐式轉換,error
return 0;
}
編譯時會報錯: