C++提供了
關(guān)鍵字explicit,可以阻止不應(yīng)該允許的經(jīng)過轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行的隱式轉(zhuǎn)換的發(fā)生。聲明為explicit的構(gòu)造函數(shù)不能在隱式轉(zhuǎn)換中使用。
C++中, 一個(gè)參數(shù)的構(gòu)造函數(shù)(或者除了第一個(gè)參數(shù)外其余參數(shù)都有默認(rèn)值的多參構(gòu)造函數(shù)), 承擔(dān)了兩個(gè)角色。 1 是個(gè)構(gòu)造器 2 是個(gè)默認(rèn)且隱含的類型轉(zhuǎn)換操作符。
所以, 有時(shí)候在我們寫下如 AAA = XXX, 這樣的代碼, 且恰好XXX的類型正好是AAA單參數(shù)構(gòu)造器的參數(shù)類型, 這時(shí)候編譯器就自動調(diào)用這個(gè)構(gòu)造器, 創(chuàng)建一個(gè)AAA的對象。
這樣看起來好象很酷, 很方便。 但在某些情況下(見下面權(quán)威的例子), 卻違背了我們(程序員)的本意。 這時(shí)候就要在這個(gè)構(gòu)造器前面加上explicit修飾, 指定這個(gè)構(gòu)造器只能被明確的調(diào)用,使用, 不能作為類型轉(zhuǎn)換操作符被隱含的使用。 呵呵, 看來還是光明正大些比較好。
explicit構(gòu)造函數(shù)的作用
解析:
explicit構(gòu)造函數(shù)是用來防止隱式轉(zhuǎn)換的。請看下面的代碼:
class Test1
{
public:
Test1(int n) { num = n; } //普通構(gòu)造函數(shù)
private:
int num;
};
class Test2
{
public:
explicit Test2(int n) { num = n; } //explicit(顯式)構(gòu)造函數(shù)
private:
int num;
};
int main()
{
Test1 t1 = 12; //隱式調(diào)用其構(gòu)造函數(shù), 成功
Test2 t2 = 12; //編譯錯(cuò)誤,不能隱式調(diào)用其構(gòu)造函數(shù)
Test2 t3(12); //顯示調(diào)用成功
return 0;
}
Test1的構(gòu)造函數(shù)帶一個(gè)int型的參數(shù),代碼19行會隱式轉(zhuǎn)換成調(diào)用Test1的這個(gè)構(gòu)造函數(shù)。而Test2的構(gòu)造函數(shù)被聲明為explicit(顯式),這表示不能通過隱式轉(zhuǎn)換來調(diào)用這個(gè)構(gòu)造函數(shù),因此代碼20行會出現(xiàn)編譯錯(cuò)誤。
普通構(gòu)造函數(shù)能夠被隱式調(diào)用。而explicit構(gòu)造函數(shù)只能被顯示調(diào)用。