- explicit 关键字只能用于类内部的构造函数声明上
- explicit 关键字作用于单个参数的构造函数。
- 在C++中,explicit 关键字用来修饰类的构造函数,被修饰的构造函数的类不能发生相应的隐式类型转换。
场景描述:
C++允许一种特殊的声明类变量的方式,可以直接将一个对应于构造函数参数类型的数据直接赋值给类变量,编译器在编译时会自动进行类型转换,将对应于构造函数参数类型转换为类的对象。如果在构造函数前加上explicit修饰词,则会禁止这种自动转换。
class testClass{
public:
int age;
int sex;
//testClass(int a, int s):age(a),sex(s){}
explicit testClass(int a,int s):age(a),sex(s){}
};
int main(){
testClass tc1(1,2);
testClass tc2={3,4}; //编译不通过,使用注释掉的构造函数则能够
cout<<tc1.age<<" "<<tc2.age <<endl;
return 0;
}
优点:避免一些类型转换导致的错误。
class String {
String (int n); //本意是预先分配n个字节给字符串
String (const char *p); //用c风格的字符串p作为初始化值
}
//正常用法
String s2(10); //分配10个字节的空字符串
String s3=String (10); //分配10个字节的空字符串
//! 导致错误的用法
String s4 = 10; //编译通过,也是分配10个字节的空字符串
String s5 = 'a'; //编译通过,分配int('a')个字节的空字符串