关键字explicit
和构造函数一起使用, 指明构造函数只能显示使用;
目的是为了防止单参数的构造函数进行不必要的隐式转化.
举个例子:
class A
{
public:
A(int x): _x(x) {};
// explicit A(int x): _x(x) {};
private:
int _x;
};
void Test(const A&)
{
...
}
-- 如果A的构造函数声明中没有explicit关键字, 那么下面的代码是正确的:
int x;
Text(x);
因为A自动构造函数隐式的把x, 构造成一个A(x)然后再传给Test(...), 相当于Test(A(x));
-- 如果A的构造函数声明总有explicit关键字, 那么上面的代码是不正确的, 必须写出下面的格式:
Text(A(x))
再举一例:
class A
{
public:
A(int x=0, int y=0): _x(x),_y(y) {};
// explicit A(int x=0, int y=0): _x(x),_y(y) {};
private:
int _x;
int _y;
};
void Test(const A& a)
{
...
}
-- 如果A的构造函数声明中没有explicit关键字, 那么下面的代码是正确的:
int x;
Text(x);
因为A自动构造函数隐式的把x, 构造成一个A(x,y=0)然后再传给Test(...), 相当于Test(A(x,y=0));
-- 如果A的构造函数声明总有explicit关键字, 那么上面的代码是不正确的, 必须写出下面的格式:
Text(A(x,y=0))