分享

c++关键字explicit使用指南

 wlk8611 2012-06-10

explicit作用:

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

explicit使用注意事项:

  • explicit 只能用于类内部的构造函数声明上。
  • 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. int _tmain(int argc, _TCHAR* argv[])
  13. {
  14. //发生隐式类型转换
  15. //编译器会将它变成如下代码
  16. //tmp = Circle(1.23)
  17. //Circle A(tmp);
  18. //tmp.~Circle();
  19. Circle A = 1.23;
  20. //注意是int型的,调用的是Circle(int x, int y = 0)
  21. //它虽然有2个参数,但后一个有默认值,任然能发生隐式转换
  22. Circle B = 123;
  23. //这个算隐式调用了拷贝构造函数
  24. Circle C = A;
  25. return 0;
  26. }
  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. int _tmain(int argc, _TCHAR* argv[])
  13. {
  14. //一下3句,都会报错
  15. //Circle A = 1.23;
  16. //Circle B = 123;
  17. //Circle C = A;
  18. //只能用显示的方式调用了
  19. //未给拷贝构造函数加explicit之前可以这样
  20. Circle A = Circle(1.23);
  21. Circle B = Circle(123);
  22. Circle C = A;
  23. //给拷贝构造函数加了explicit后只能这样了
  24. Circle A(1.23);
  25. Circle B(123);
  26. Circle C(A);
  27. return 0;
  28. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多