zoukankan      html  css  js  c++  java
  • [转]C++ explicit的作用

    explicit作用:

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

    explicit使用注意事项:

        *

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

        *

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

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

    例子:

    未加explicit时的隐式类型转换

       1. class Circle  
       2. {  
       3. public:  
       4.     Circle(double r) : R(r) {}  
       5.     Circle(int x, int y = 0) : X(x), Y(y) {}  
       6.     Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}  
       7. private:  
       8.     double R;  
       9.     int    X;  
      10.     int    Y;  
      11. };  
      12.   
      13. int _tmain(int argc, _TCHAR* argv[])  
      14. {  
      15. //发生隐式类型转换  
      16. //编译器会将它变成如下代码  
      17. //tmp = Circle(1.23)  
      18. //Circle A(tmp);  
      19. //tmp.~Circle();  
      20.     Circle A = 1.23;   
      21. //注意是int型的,调用的是Circle(int x, int y = 0)  
      22. //它虽然有2个参数,但后一个有默认值,任然能发生隐式转换  
      23.     Circle B = 123;  
      24. //这个算隐式调用了拷贝构造函数  
      25.     Circle C = A;  
      26.       
      27.     return 0;  
      28. } 

    加了explicit关键字后,可防止以上隐式类型转换发生

       1. class Circle  
       2. {  
       3. public:  
       4.     explicit Circle(double r) : R(r) {}  
       5.     explicit Circle(int x, int y = 0) : X(x), Y(y) {}  
       6.     explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}  
       7. private:  
       8.     double R;  
       9.     int    X;  
      10.     int    Y;  
      11. };  
      12.   
      13. int _tmain(int argc, _TCHAR* argv[])  
      14. {  
      15. //一下3句,都会报错  
      16.     //Circle A = 1.23;   
      17.     //Circle B = 123;  
      18.     //Circle C = A;  
      19.       
      20. //只能用显示的方式调用了  
      21. //未给拷贝构造函数加explicit之前可以这样  
      22.          Circle A = Circle(1.23);  
      23.         Circle B = Circle(123);  
      24.         Circle C = A;  
      25.   
      26. //给拷贝构造函数加了explicit后只能这样了  
      27.          Circle A(1.23);  
      28.         Circle B(123);  
      29.         Circle C(A);  
      30.     return 0;  
      31. } 

    参考http://www.cnblogs.com/this-543273659/archive/2011/08/02/2124596.html

  • 相关阅读:
    【Elasticsearch 技术分享】—— ES 常用名词及结构
    【Elasticsearch 技术分享】—— Elasticsearch ?倒排索引?这都是什么?
    除了读写锁,JUC 下面还有个 StampedLock!还不过来了解一下么?
    小伙伴想写个 IDEA 插件么?这些 API 了解一下!
    部署Microsoft.ReportViewe
    关于TFS强制undo他人check out
    几段查看数据库表占用硬盘空间的tsql
    How to perform validation on sumbit only
    TFS 2012 Disable Multiple Check-out
    在Chrome Console中加载jQuery
  • 原文地址:https://www.cnblogs.com/zhanjxcom/p/5734953.html
Copyright © 2011-2022 走看看