认识 C++ 中的 explicit 关键字
来源:百度文库 编辑:神马文学网 时间:2024/04/30 14:59:32
带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
class C {
int i;
//...
public:
C(int i);//constructor and implicit conversion operator
//as well
};
void f() {
C c(0);
c = 5; //将 5 隐式转换为 C 对象,然后赋值
}
编译器重新编辑上述例子代码,如下:
//////////////////////////////////////////////////////////////////////////////////////////
//"c=5;" 被编译器转换成下面这个样子:
/////////////////////////////////////////////////////////////////////////////////////////
C temp(5);// 实例化一个临时对象,
c = temp; // 用 = 赋值
temp.C::~C(); // temp 的析构函数被激活
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
class String {
int size;
char *p;
//..
public:
String (int sz); //这里不希望进行隐式转换操作
};
void f ()
{
String s(10);
// 下面是一个程序员的编码;发生一个意想不到的转换:
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
}
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
class String {
int size;
char *p;
//..
public:
// 不要隐式转换
explicit String (int sz);
String (const char *s, int size n = 0); // 隐式转换
};
void f ()
{
String s(10);
s = 100; // 现在编译时出错;需要显式转换:
s = String(100); // 好;显式转换
s = "st"; // 好;此时允许隐式转换
}
class C {
int i;
//...
public:
C(int i);//constructor and implicit conversion operator
//as well
};
void f() {
C c(0);
c = 5; //将 5 隐式转换为 C 对象,然后赋值
}
编译器重新编辑上述例子代码,如下:
//////////////////////////////////////////////////////////////////////////////////////////
//"c=5;" 被编译器转换成下面这个样子:
/////////////////////////////////////////////////////////////////////////////////////////
C temp(5);// 实例化一个临时对象,
c = temp; // 用 = 赋值
temp.C::~C(); // temp 的析构函数被激活
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
class String {
int size;
char *p;
//..
public:
String (int sz); //这里不希望进行隐式转换操作
};
void f ()
{
String s(10);
// 下面是一个程序员的编码;发生一个意想不到的转换:
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
}
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
class String {
int size;
char *p;
//..
public:
// 不要隐式转换
explicit String (int sz);
String (const char *s, int size n = 0); // 隐式转换
};
void f ()
{
String s(10);
s = 100; // 现在编译时出错;需要显式转换:
s = String(100); // 好;显式转换
s = "st"; // 好;此时允许隐式转换
}
认识 C++ 中的 explicit 关键字
C++中的explicit关键字
C++的explicit关键字
C++关键字:mutable、volatile、explicit以及__based - 只...
C# 参考之转换关键字:operator、explicit与implicit
C语言中volatile关键字-学院-黑基网
关键字
深入理解C++中的mutable关键字
C语言32个关键字解释 -- love_you_forever -- 编程爱好者博客
博客园 - 鸟食轩 - JScript中的""this""关键字使用方式补充
定义变量注意ActionScript3.0中的保留字和关键字
认识素描中的明暗
认识素描中的明暗
C语言中的break
C语言中关键字auto、static、register、const、volatile、extern的作用
const关键字(二) - C语言各种修饰符 - Embedded and Linux
全面认识文革中的"红卫兵"
全面认识文革中的"红卫兵"
全面认识文革中的"红卫兵"
全面认识文革中的“红卫兵”
认识照片中的人吗
全面认识文革中的红卫兵
拔火罐治病认识中的误区
认识身体中的四大元素