明確 (C++)
C + + 建構函式具有一個參數會自動執行隱含型別轉換。 例如,如果您傳遞int建構函式必須為字串的指標參數,編譯器將會加入程式碼,它必須要有轉換int為字串的指標。 不過,您可能永遠都不要此自動的方式。
您可以將explicit來建構函式宣告,以避免隱含轉換。 這會強制程式碼使用正確的型別參數,或將參數轉換成正確的型別。 也就是說,如果轉換不明顯表示程式碼中,會產生錯誤。
explicit關鍵字只能套用至類別來明確地建構物件的建構函式宣告。
範例
編譯下列的程式,就會產生錯誤。 此程式碼嘗試執行隱含轉換,但使用explicit關鍵字可避免它。 若要解決這個錯誤,請移除explicit關鍵字,並調整中的程式碼g。
// spec1_explicit.cpp
// compile with: /EHsc
#include <stdio.h>
class C
{
public:
int i;
explicit C(const C&) // an explicit copy constructor
{
printf_s("\nin the copy constructor");
}
explicit C(int i ) // an explicit constructor
{
printf_s("\nin the constructor");
}
C()
{
i = 0;
}
};
class C2
{
public:
int i;
explicit C2(int i ) // an explicit constructor
{
}
};
C f(C c)
{ // C2558
c.i = 2;
return c; // first call to copy constructor
}
void f2(C2)
{
}
void g(int i)
{
f2(i); // C2558
// try the following line instead
// f2(C2(i));
}
int main()
{
C c, d;
d = f(c); // c is copied
}
宣告建構函式具有多個引數是explicit沒有任何反應,因為這類建構函式不能參與於隱含轉換。 不過, explicit的建構函式具有多個引數,以及所有,除了其中一個引數具有預設值將會有作用。