explicit關鍵字用于取消構造函數的隱式轉換,對有多個參數的構造函數使用explicit是個語法錯誤。
In C++ it is possible to declare constructors for a class, taking a
single parameter, and use those constructors for doing type conversion.
For example:
class?A?{
public:
??????? A(int);
};
void?f(A)?{}
void?g()
{
???????? A?a1?=?37;
???????? A?a2?=?A(47);
???????? A?a3(57);
???????? a1?=?67;
???????? f(77);
}
A declaration like:
?A a1 = 37;
says to call the A(int) constructor to create an A object from
the integer value. Such a constructor is called a "converting
constructor".
However, this type of implicit conversion can
be confusing, and there is a way of disabling it, using a new keyword
"explicit" in the constructor declaration:
class?A?{
public:
??????? explicit?A(int);
};
void?f(A)?{}
void?g()
{
????????? A?a1?=?37;??????//?illegal
????????? A?a2?=?A(47);???//?OK
????????? A?a3(57);???????//?OK
????????? a1?=?67;????????//?illegal
????????? f(77);??????????//?illegal
}
Using the explicit keyword, a constructor is declared to be
"nonconverting", and explicit constructor syntax is required:
class?A?{
public:
????????explicit?A(int);
????????};
void?f(A)?{}
void?g()
{
????????A?a1?=?A(37);
????????A?a2?=?A(47);
????????A?a3(57);
????????a1?=?A(67);
????????f(A(77));
}
Note that an expression such as:
A(47)
is closely related to function-style casts supported by C++. For example:
double d = 12.34;
int i = int(d);