explicit关键字
首先举一两个例子:
class MyString
{
//分配n个字节空间
MyString(int n);
//利用const char*初始化
MyString(const char* str);
};
MyString strMy(7); //调用第一个构造函数,分配7个字节空间
MyString strMy1 = MyString(7);//没有问题
MyString strMy2 = ’a';//这样调用呢?你可能会认为是用字符a初始化, //其实 还是分配int('a')也就是97个字节的空间
以上strMy2的初始化是一种隐式的转换,很明显,又些时候,我们需要避免这种隐式的转换,以防止不可控制的程序bug,那么,我们只需要在第一个构造函数前用explicit关键字限定即可:如下:
class MyString
{
//分配n个字节空间
explicit MyString(int n);
//利用const char*初始化
MyString(const char* str);
};
MyString strMy1 = 7; //编译报错,无法隐式转换
MyString strMy2 = ’a';//编译报错,无法隐式转换
MyString strMy3(7); //调用第一个构造函数,分配7个字节空间
MyString strMy4 = MyString(7);//没有问题 同上