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

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

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

class MyClass
{
public:MyClass(int num){};
};MyClass obj = 10;//10被隐式调用构造函数转换为MyClass类型对象

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

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

class MyClass
{
public:explicit MyClass(int num){};
};MyClass obj = 10;//出错


class Rational
{
public:Rational(int numerator = 0, int denominator = 1){this->numerator = numerator;this->denominator = denominator;}~Rational(){}int get_numerator(){return numerator;}int get_denominator(){return denominator;}const Rational operator*(const Rational &rhs) const;private:int numerator;int denominator;
};const Rational Rational::operator*(const Rational &rhs) const
{return Rational(numerator * rhs.numerator, denominator*rhs.denominator);
}int main()
{Rational a(2, 1);//Rational b = 2 * a;//编译出错,相当于2.operator*(a),而2不是Rational类型Rational b = a * 2;//2会被隐式类型转换为Rational对象cout << b.get_numerator() << " " << b.get_denominator() << endl;system("pause");return 0;
}

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

class Rational
{
public:Rational(int numerator = 0, int denominator = 1){this->numerator = numerator;this->denominator = denominator;}~Rational(){}int get_numerator() const{return numerator;}int get_denominator() const{return denominator;}private:int numerator;int denominator;
};const Rational operator*(const Rational& lhs,const Rational &rhs)
{return Rational(lhs.get_numerator() * rhs.get_numerator(), lhs.get_denominator()*rhs.get_denominator());
}int main()
{Rational a(2, 1);//2会被隐式类型转换为Rational对象Rational b = 2 * a;//Rational b = a * 2;cout << b.get_numerator() << " " << b.get_denominator() << endl;system("pause");return 0;
}

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

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

转载于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3897349.html

【c++】【转】c++中的explicit关键字相关推荐

  1. c++中的explicit关键字

    2007-05-11 14:42:00 | 作者: Admin ] c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有&quo ...

  2. 深入理解C++中的explicit关键字

    深入理解C++中的explicit关键字 kezunhai@gmail.com http://blog.csdn.net/kezunhai C++中的explicit关键字只能用于修饰只有一个参数的构 ...

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

    c++中的explicit关键字用来修饰类的构造函数,被修饰的类的构造函数不能进行隐式类型的转换,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐 ...

  4. 【转】认识 C++ 中的 explicit 关键字

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

  5. VC++工作笔记0003---C++中的explicit关键字

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 个人理解: 这个的作用,其实就是,防止隐式转换,因为如果有隐式转换的话,那么用起来,感觉就怪怪的, ...

  6. C++中的explicit关键字介绍

    C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换.类构造函数默认情况下声明为隐式的即implicit. 隐式转 ...

  7. 【C++】explicit关键字

    explicit的优点是可以避免不合时宜的类型变换,缺点无.所以google约定所有单参数的构造函数都必须是显式的** explicit关键字只需用于类内的单参数构造函数前面.由于无参数的构造函数和多 ...

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

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

  9. explicit关键字详解(C++ )

    一:首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造 ...

最新文章

  1. 分贝dB与放大倍数的转换关系
  2. 分布式内存数据库---Redis操作String、list、set、hash和Zset
  3. 差分放大电路差模共模公式_选择正确的放大器
  4. 【10.20校内测试】【小模拟】【无向图建树判奇偶环】【树上差分】
  5. techempower拿分系列之aspcore分析
  6. python django restful框架_Django RESTful API 实例带你快速上手开发
  7. 2018.03.12、Android知识点-Java篇
  8. 用hundred造句子_2020朋友圈感恩节祝福语大全:微信感恩节鞠躬的图片文案句子说说[多图]...
  9. webpack钩子调用shell笔记
  10. impala的substr从第几位截到最后一位_冰雪奇缘2彩蛋:片名内含深意,艾莎是第13位公主象征着背叛...
  11. PHP正则表达式实例汇总
  12. 直播APP源码,视频直播技术篇 。
  13. 学科竞赛管理系统服务器错误,大学生学科竞赛管理系统的设计与实现
  14. (学习笔记)图像处理——Retinex增强
  15. oracle 数据库备份脚本
  16. 基于统计语言模型的拼音输入法
  17. c语言小游戏跳一跳代码及注释,c语言小游戏程序之弹跳小球的实现代码
  18. google guava Joiner 示列
  19. 计算机英语中文参考书,推荐几本计算机英语书?
  20. HTML网页设计基础——用户注册界面

热门文章

  1. 【STM32】 keil软件介绍--工程目标选项配置(上)
  2. 社区计算机义务维修策划书,计协义务维修策划书(模板).doc
  3. tl494组成的超声波发射电路_透彻分析利用TL494组成的逆变器电路
  4. android查看存储占用,Android获取App内存使用情况的方法
  5. ios获取手机 meid_共享充电宝并不简单,iOS也顶不住,隐私信息直接暴露
  6. mobileNet v2网络详解
  7. mybitys 动态sql 注释_mybatis注解动态sql详解
  8. HDU-4777 Rabbit Kingdomom(树状数组、区间离线)
  9. boot spring test 文档_SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库
  10. pytorch 之 torch.eye()函数