explicit構造函數是用來防止隐式轉換的。看下面一段代碼:
class Test1
{
public:
Test1(int n){num = n ;}; //普通構造函數
private:
int num ;
};
class Test2
{
public:
explicit Test2(int n ){num = n ;} //explicit(顯示)構造函數
private:
int num ;
};
int main()
{
Test1 t1 = 12 ; //隐式調用其構造函數,成功
Test2 t2 = 12 ; //編譯錯誤,不能隐式調用其構造函數
Test2 t3(12) ; //顯示調用成功
return 0 ;
}
Test1的構造函數帶一個int型參數,代碼第19行會隐式轉換成調用Test1的這個構造函數。而Test2的構造函數被聲明為explicit(顯示),這表示不能通過隐式轉換來調用這個構造函數,是以代碼第20行會出現編譯錯誤。
普通構造函數能被隐式調用,而explicit構造函數隻能被顯示調用。
下面的程式f()被調用時,輸出是什麼:
#include <iostream>
#include <string>
using namespace std ;
class Number
{
public:
string type ;
Number() : type("void") {}
explicit Number(short) : type("short") {}
Number(int) :type("int"){}
};
void Show(const Number& n){cout<<n.type ;}
void main()
{
short s = 42 ;
Show(s) ;
}
Show函數的參數類型是Nunmber類對象的引用,代碼第19行調用Show(s)時采取了以下的步驟:
(1)Show(s)中的s為short類型,其值為42,是以首先檢查參數為short的構造函數能否被隐式轉換。由于代碼第10行的構造函數被聲明為顯示調用(explicit),是以不能隐式轉換。于是進行下一步。
(2)42自動轉換為int類型。
(3)檢查參數為int的構造函數能否被隐式轉換。由于代碼第11行參數為int的構造函數沒有被聲明為顯示調用,是以調用此構造函數構造出一個臨時對象。