C++中的explicit关键字只能用于修饰 只有一个参数的类构造函数。
explicit的作用:表明该构造函数是 显式 的,而非隐式的。
- 跟explicit相对应的另一个关键字是implicit,意思是隐藏的。
- 类构造函数默认情况下即声明为implicit(隐式)。
class CxString
{
public:
CxString(int size)
{
_size = size; //string的预设大小
_pstr = malloc(size+1); //分配string的内存
memset(_pstr,0,size+1);
}
CxString(const char *p)
{
int size = strlen(p);
_pstr = malloc(size+1); //分配string的内存
strcpy(_pstr,p); //复制字符串
_size = strlen(_pstr);
}
private:
char *_pstr;
int _size;
};
CxString string1(24); // OK, 为CxString预分配24字节的大小的内存,调用的是CxString(int size)
CxString string2 = 10; // OK, 为CxString预分配10字节的大小的内存,调用的是CxString(int size)
/*
// 在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作: 将该构造函数对应数据类型的数据转换为该类对象。
CxString string2 = 10; //编译器会自动将int转换为CxString对象。
//等同于以下操作
CxString string2(10);
// 或
CxString temp(10);
CxString string2 = temp;
*/
CxString string3 = "bbb"; // OK, 调用的是CxString(const char *p)
CxString string4 = 'c'; // 这样也是OK的, 其实调用的是CxString(int size), 且size等于'c'的ascii码
以上 第2句的CxString string2 = 10; 和第4句 CxString string6 = 'c'; 就显得不伦不类。有什么办法阻止这种用法呢? 答案就是使用explicit关键字。
class CxString // 使用关键字explicit的类声明, 显示转换
{
public:
char *_pstr;
int _size;
explicit CxString(int size)
{
_size = size;
// 代码同上, 省略...
}
CxString(const char *p)
{
// 代码同上, 省略...
}
};
// 下面是调用:
CxString string1(24); // 这样是OK的
CxString string2 = 10; // 这样是不行的, 因为explicit关键字取消了隐式转换
CxString string3; // 这样是不行的, 因为没有默认构造函数
CxString string4("aaaa"); // 这样是OK的
CxString string5 = "bbb"; // 这样也是OK的, 调用的是CxString(const char *p)
CxString string6 = 'c'; // 这样是不行的, 其实调用的是CxString(int size), 且size等于'c'的ascii码, 但explicit关键字取消了隐式转换
string1 = 2; // 这样也是不行的, 因为取消了隐式转换
string2 = 3; // 这样也是不行的, 因为取消了隐式转换
string3 = string1; // 这样也是不行的, 因为取消了隐式转换, 除非类实现操作符"="的重载
C++中的explicit关键字用于防止隐式类型转换,避免在类构造函数只有一个参数时出现不期望的对象创建方式。通过使用explicit,可以消除如`CxString string2 = 10;`这样的自动转换,增强代码的清晰性和安全性。明确地调用构造函数成为必要,例如`CxString string2(10);`。这有助于避免潜在的错误和意外行为。

2183

被折叠的 条评论
为什么被折叠?



