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

  • 相关阅读:
    进度条
    html5 表单新增事件
    html5 表单的新增type属性
    html5 表单的新增元素
    html5 语义化标签
    jq 手风琴案例
    codeforces 702D D. Road to Post Office(数学)
    codeforces 702C C. Cellular Network(水题)
    codeforces 702B B. Powers of Two(水题)
    codeforces 702A A. Maximum Increase(水题)
  • 原文地址:https://www.cnblogs.com/zhanjxcom/p/5734953.html
Copyright © 2011-2022 走看看