博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ explicit
阅读量:7080 次
发布时间:2019-06-28

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

hot3.png

  • explicit作用

在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

  • 使用注意事项

      explicit 关键字只能用于类内部的构造函数声明上。

      explicit 关键字作用于单个参数的构造函数。

      explicit 关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换

  • 未加explicit时的隐式类型转换

class Circle  {   public:       Circle(double r) : R(r) {}       Circle(int x, int y = 0) : X(x), Y(y) {}       Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}   private:       double R;       int    X;       int    Y;  };     int_t main(int argc, _TCHAR* argv[])  {      Circle A = 1.23;    // 发生隐式类型转换                          // 编译器会将它变成如下代码                          // tmp = Circle(1.23)                          // Circle A(tmp);                          // tmp.~Circle();      Circle B = 123;     // 注意是int型的,调用的是Circle(int x, int y = 0)                          // 它虽然有2个参数,但后一个有默认值,任然能发生隐式转换       Circle C = A;       // 这个算隐式调用了拷贝构造函数            return 0;  }
  • 加了explicit关键字后,可防止以上隐式类型转换发生

class Circle  {  public:      explicit Circle(double r) : R(r) {}      explicit Circle(int x, int y = 0) : X(x), Y(y) {}      explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}  private:      double R;      int    X;      int    Y;  };    int_t main(int argc, _TCHAR* argv[])  {      // 以下3句,都会报错      // Circle A = 1.23;       // Circle B = 123;      // Circle C = A;            // 只能用显示的方式调用了      // 未给拷贝构造函数加explicit之前可以这样  	Circle A = Circle(1.23);  	Circle B = Circle(123);  	Circle C = A;        // 给拷贝构造函数加了explicit后只能这样了  	Circle A(1.23);  	Circle B(123);  	Circle C(A);      	return 0;  }

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

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

转载于:https://my.oschina.net/wellsoschina/blog/335116

你可能感兴趣的文章
mysql的存储过程和函数
查看>>
加密解密之异或加密方式
查看>>
php中exec,system等函数的作用
查看>>
递归目录的shell脚本
查看>>
[LeetCode] Single Number III
查看>>
angularjs 简单指令
查看>>
Base64加密
查看>>
BZOJ2730:[HNOI2012]矿场搭建——题解
查看>>
分区表转换
查看>>
ASP.NET 一般处理程序 接收文件上传
查看>>
WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(核心)(转)
查看>>
Java Excel 列号数字与字母互相转换
查看>>
Android中下拉框spinner的两种用法
查看>>
Hibernate SQL
查看>>
C#中的静态
查看>>
MySQL的语法高级之SELECT
查看>>
Unity3D脚本行尾(Line Endings)
查看>>
Bootstrap3 排版-页面主体
查看>>
【pom.xml 依赖】使用net.sf.json-lib-2.4-jdk15.jar所需要的其他依赖架包 以及其一直在pom.xml报错的问题...
查看>>
Git与GitHub的简单了解(3)
查看>>