explicit关键字
来源:互联网 发布:华为光伏数据采集器 编辑:程序博客网 时间:2024/06/03 21:49
explicit用来防止由构造函数定义的隐式转换。
要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。
例如:
{
public:
things(const std::string&name =""):
m_name(name),height(0),weight(10){}
int CompareTo(const things & other);
std::string m_name;
int height;
int weight;
};
这里things的构造函数可以只用一个实参完成初始化。所以可以进行一个隐式转换,像下面这样:
................//在这里被初始化并使用。
std::string nm ="book_1";
//由于可以隐式转换,所以可以下面这样使用
int result = a.CompareTo(nm);
这段程序使用一个string类型对象作为实参传给things的CompareTo函数。这个函数本来是需要一个tings对象作为实参。现在编译器使用string nm来构造并初始化一个things对象,新生成的临时的things对象被传递给CompareTo函数,并在离开这段函数后被析构。
这种行为的正确与否取决于业务需要。假如你只是想测试一下a的重量与10的大小之比,这么做也许是方便的。但是假如在CompareTo函数中还涉及到了要除以初始化为0的height属性,那么这么做可能就是错误的。需要在构造tings之后更改height属性不为0。所以要限制这种隐式类型转换。
那么这时候就可以通过将构造函数声明为explicit,来防止隐式类型转换。
explicit关键字只能用于类内部的构造函数声明上,而不能用在类外部的函数定义上。现在things类像这样:
{
public:
explicit things(const std::string&name =""):
m_name(name),height(0),weight(0){}
int CompareTo(const things & other);
std::string m_name;
int height;
int weight;
};
这时再进行编译,在vs2008上会提示:没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符。
这时你仍然可以通过显示使用构造函数完成上面的类型转换:
................//在这里被初始化并使用。
std::string nm ="book_1";
//显示使用构造函数
int result = a.CompareTo(things(nm));
google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以google约定所有单参数的构造函数都必须是显示的,只有极少数情况下拷贝构造函数可以不声明称explicit。例如作为其他类的透明包装器的类。
- explicit 关键字
- Explicit 关键字
- Explicit 关键字
- explicit关键字
- 关键字explicit
- explicit关键字
- explicit关键字
- explicit关键字
- 关键字explicit
- explicit关键字
- Explicit 关键字
- 关键字 explicit
- explicit关键字
- 关键字 explicit
- explicit关键字
- explicit 关键字
- explicit 关键字
- explicit关键字
- php导入excel更便捷的方法
- 1. jquery用submit提交表单返回json
- 数据结构:第三章总结
- 【记录】ARM命名规则
- Dll的分析与编写(一)
- explicit关键字
- 第十一周项目6-1-反序数
- 按钮不可用,按钮至灰做法
- Debug Multithread DLL 与 Debug Multithread
- redhat下ngnix安装
- opencl build机器码程序
- 2015互联网校招总结—一路走来(转载)
- Debian Linux 下获得Root权限以及使用Root登入图像界面的办法
- Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果 .