博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 中使用explicit关键字避免隐式转换
阅读量:5870 次
发布时间:2019-06-19

本文共 1571 字,大约阅读时间需要 5 分钟。

explicit用来防止由构造函数定义的隐式转换。

要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。

例如:

class things{    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的构造函数可以只用一个实参完成初始化。所以可以进行一个隐式转换,像下面这样:

things a;................//在这里被初始化并使用。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类像这样:

class 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上会提示:没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符。

  这时你仍然可以通过显示使用构造函数完成上面的类型转换:

things a;................//在这里被初始化并使用。std::string nm = "book_1";//显示使用构造函数int result = a.CompareTo(things(nm));

  google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以google约定所有单参数的构造函数都必须是显示的,只有极少数情况下拷贝构造函数可以不声明称explicit。例如作为其他类的透明包装器的类。

  effective c++中说:被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期(往往也不被期望)的类型 转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。我鼓励你遵循相同的政策。

转载地址:http://kdxnx.baihongyu.com/

你可能感兴趣的文章
数据结构 - 二叉树(重构 + 遍历)
查看>>
四则运算程序
查看>>
手机端页面自适应解决方案
查看>>
15. 3Sum C++
查看>>
软件工程学概述(一)
查看>>
linux fdisk
查看>>
异或运算符使指定为翻转
查看>>
Eclipse Maven 构建(转)
查看>>
常用正则表达式积累
查看>>
关于微信公众号开发的一些坑
查看>>
ubuntu 16.04 的IP地址变更
查看>>
【网络流】【1010】【棋盘加数】
查看>>
PHP学习笔记(一)数组
查看>>
2013年noip第三题货车运输truck(树链剖分LCA+最大生成树)
查看>>
js知识点 知识树 知识结构 (转载 学习中)
查看>>
位,移位,逻辑运算
查看>>
sublime flake8 line too long错误提示修改
查看>>
浅谈C中的指针和数组(七)
查看>>
跟随我在oracle学习php(46)
查看>>
第1章 Activity的生命周期和启动模式
查看>>