explicit关键字
explicit关键字的作用就是防止类构造函数的隐式自动转换
explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就 无效了.
当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数
class CxString // 没有使用explicit关键字的类声明, 即默认为隐式声明
{
public:
char *_pstr;
int _size;
//下面两个构造函数用于对_pstr赋值
CxString(int size) { ....省略..... }
CxString(const char *p) { ...省略. }
// 析构函数这里不讨论, 省略...
};
// 下面是调用:
CxString string1(24); // 这样是OK的, 为CxString预分配24字节的大小的内存
CxString string2 = 10; // 这样是OK的, 为CxString预分配10字节的大小的内存
CxString string3; // 这样是不行的, 因为没有默认构造函数, 错误为: “CxString”: 没有合适的默认构造函数可用
CxString string4("aaaa"); // 这样是OK的
CxString string5 = "bbb"; // 这样也是OK的, 调用的是CxString(const char *p)
CxString string6 = 'c'; // 这样也是OK的, 其实调用的是CxString(int size), 且size等于'c'的ascii码
string1 = 2; // 这样也是OK的, 为CxString预分配2字节的大小的内存
string2 = 3; // 这样也是OK的, 为CxString预分配3字节的大小的内存
string3 = string1; // 这样也是OK的, 至少编译是没问题的, 但是如果析构函数里用free释放_pstr内存指针的时候可能会报错, 完整的代码必须重载运算符"=", 并在其中处理内存释放
上面 CxString string3; 是不行的,因为没有对应的构造函数,所以会出错的
但是 CxString string2 = 10; 是可以的,这里会在编译的时候就会有一个缺省的转换操作,即CxString string2(10);
这就显得不伦不类, 而且容易让人疑惑,所以需要将这个缺省的转换操作关掉,那么就需要在构造函数前面加上explicit关键字,
如果加上的话, string1 = 2; string2 = 3; string3 = string1; 都是错的,必须要有参数
参考https://blog.csdn.net/guoyunfei123/article/details/89003369