http://www.cnblogs.com/chio/archive/2007/09/17/895263.html

c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式(调用)的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?

如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数参数对应数据类型的数据转换为该类对象,如下面所示:

  1. class MyClass
  2. {
  3. public:
  4. MyClass(int num){};
  5. };
  6.  
  7. MyClass obj = ;//10被隐式调用构造函数转换为MyClass类型对象

在上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作:
MyClass temp(10);
MyClass obj = temp;
上面的所有的操作即是所谓的"隐式转换"。

如果要避免这种自动转换的功能,我们该怎么做呢?这就是关键字explicit的作用了,将类的构造函数声明为"显式",也就是在声明构造函数的时候前面添加上explicit即可,这样就可以防止这种自动的转换操作,如果我们修改上面的MyClass类的构造函数为显式的,那么下面的代码就不能够编译通过了,如下所示:

  1. class MyClass
  2. {
  3. public:
  4. explicit MyClass(int num){};
  5. };
  6.  
  7. MyClass obj = ;//出错

  1. class Rational
  2. {
  3. public:
  4. Rational(int numerator = , int denominator = )
  5. {
  6. this->numerator = numerator;
  7. this->denominator = denominator;
  8. }
  9. ~Rational(){}
  10. int get_numerator()
  11. {
  12. return numerator;
  13. }
  14. int get_denominator()
  15. {
  16. return denominator;
  17. }
  18.  
  19. const Rational operator*(const Rational &rhs) const;
  20.  
  21. private:
  22. int numerator;
  23. int denominator;
  24. };
  25.  
  26. const Rational Rational::operator*(const Rational &rhs) const
  27. {
  28. return Rational(numerator * rhs.numerator, denominator*rhs.denominator);
  29. }
  30.  
  31. int main()
  32. {
  33. Rational a(, );
  34. //Rational b = 2 * a;//编译出错,相当于2.operator*(a),而2不是Rational类型
  35. Rational b = a * ;//2会被隐式类型转换为Rational对象
  36. cout << b.get_numerator() << " " << b.get_denominator() << endl;
  37.  
  38. system("pause");
  39. return ;
  40. }

上述有理数运算不满足交换律,所以需要改进

  1. class Rational
  2. {
  3. public:
  4. Rational(int numerator = , int denominator = )
  5. {
  6. this->numerator = numerator;
  7. this->denominator = denominator;
  8. }
  9. ~Rational(){}
  10. int get_numerator() const
  11. {
  12. return numerator;
  13. }
  14. int get_denominator() const
  15. {
  16. return denominator;
  17. }
  18.  
  19. private:
  20. int numerator;
  21. int denominator;
  22. };
  23.  
  24. const Rational operator*(const Rational& lhs,const Rational &rhs)
  25. {
  26. return Rational(lhs.get_numerator() * rhs.get_numerator(), lhs.get_denominator()*rhs.get_denominator());
  27. }
  28.  
  29. int main()
  30. {
  31. Rational a(, );
  32. //2会被隐式类型转换为Rational对象
  33. Rational b = * a;
  34. //Rational b = a * 2;
  35. cout << b.get_numerator() << " " << b.get_denominator() << endl;
  36.  
  37. system("pause");
  38. return ;
  39. }

总结:如果你需要为某个函数的所有参数进行类型转换,那么这个函数必须是个non-member(effective c++ 条款24)

绝不要返回指针或引用指向一个local stack对象,因为local stack对象当退出函数时就被析构了,也就是说指针或者引用指向未知的内存;不要返回引用指向一个heap-allocated对象,会导致内存泄漏;不要返回指针或引用指向一个local static对象,因为有可能同时需要多个这样的对象,此时这些对象其实都是同一个对象。所以一个必须返回新对象的函数的正确写法是:让那个函数返回一个新对象,不用担心拷贝构造函数导致的性能损失。例子可见上面的operator*的写法(effective c++ 条款21)

【c++】【转】c++中的explicit关键字的更多相关文章

  1. C++中的explicit关键字的用法

    一.explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. 二.explicit使用注意事项: ...

  2. C++中的explicit关键字

    http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html 上面链接中的博主写的很好,我也不多说了.举得例子也很好,应该也是看了E ...

  3. C++中的explicit关键字 - 抑制隐式转换(转)

    在C++程序中很少有人去使用 explicit 关键字,不可否认,在平时的实践中确实很少能用的上.再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决.但稍微留心一下就会发现现有的MFC库 ...

  4. C++中的explicit关键字(转)

    按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举个例子: #pragma once class CExample { public: CExample(void); CExample(); ...

  5. C++ explicit关键字详解

    本文系转载,原文链接:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用 ...

  6. explicit关键字

    C++中,explicit关键字用来修饰类只有一个参数的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: explicit 关 ...

  7. C++explicit关键字

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

  8. C++ explicit关键字详解(转载)

    转载:https://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函 ...

  9. C++ explicit 关键字

    原文转自:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造 ...

随机推荐

  1. java实现的单点登录

    摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...

  2. 解决VS2010提示warning C4068: 未知的杂注

    出现原因是#pragma声明问题,加上#pragma warning(disable:4068)即可 #pragma warning(disable:4068)#pragma execution_ch ...

  3. JavaScript——responseType

    https://www.cnblogs.com/cdemo/p/5225848.html https://blog.csdn.net/wkyseo/article/details/78232485 异 ...

  4. Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...

  5. java实现的判断括号是否成对的代码,()[]{}都可以

    本来想找找现成的,去,都写的好复杂.自己写一个吧.挺有成就感.哈哈 package com.test.jiexi; import java.util.Stack; public class Check ...

  6. numpy调试

    x1 = np.arange(9.0) 结果就是: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8.]) 拿这个来初始化进行调试

  7. Vue+Bootstrap实现购物车程序(1)

    先看下案例效果:(简单的数量控制及价格运算) 代码: <!DOCTYPE html> <html> <head lang="en"> <m ...

  8. ubuntu12.04 配置apache+modwsgi+django1.5

    1.首先下载modwsgi  链接如下: http://files.cnblogs.com/baoyiluo/mod_wsgi-3.4.zip 2.解压并安装mod_wsgi: ./configure ...

  9. 关闭警告&关闭eslint

    1.main.js中添加 vue.config.productiontip = false  这样即可去除警告!  第一个除了那个配置意外,还需要将 NODE_ENV 设置为 production 参 ...

  10. scrollfix.js插件:滚动固定在某个位置

    插件文件在/文件 scrollfix.js 用法: var fix = $(".fix"), fixtop = $(".fix-top"), fixStartT ...