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

posted @ 2022-05-15 21:49  贪睡地蜗牛  阅读(52)  评论(0编辑  收藏  举报