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);