explicit关键字

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数只能显式调用, 而不能充当转换构造函数(当构造函数只有一个参数或其他参数都有缺省值时)。 跟它相对应的另一个关键字是implicit,。类构造函数默认情况下即声明为implicit。

为何尽量对单参数构造函数使用explicit?

1
2
3
4
5
6
7
8
9
10
11
12
13
class A{
public:
A(int x){
cout<<"我被用了"<<endl;
}
};
void func(A a){}
int main( ){

func(1);// 被隐式转换为func(A(1)) ,本来是1却被自动调用了A(1)这就是拷贝初始化
//输出:"我被调用了"
return 0;
}

而实际上,func(1)可能只是操作失误。

什么时候下,构造函数可以充当转换构造函数?

  • 当构造函数只有一个参数且没有explict关键字修饰时。
  • 当构造函数有多个参数且除第一个参数外其他参数都有默认值(第一个参数也可以有)时。