原则24:若所有参数皆需要类型转换,请为此采用非member函数

这是Effective C++中第24个原则,即非成员函数能够完美解决题目中所叙述的情景。
作者以一个有理数类的例子来诠释本原则所述内容。这个例子大致是这样的,这个有理数类有一个带有默认值参数的构造函数,并且也有一个重载的乘法操作符,并且这个重载操作符函数只接受一个有理数类的对象。现在在它参数的位置上放上一个整数,因为构造函数并非显示,所以它允许将这个整数隐式转换成该类的类型而参与运算。
但是奇怪的现象来了,因为这个重载操作符是单目操作符,这时出现了一个赋值语句,


这个就是这个单目操作符,oneHalf是一个有理数类对象,2是整数,2可以被隐式转换成有理数类型。但是下面这个表达式

从逻辑上将实现的功能是一样的,但是它确报错,这是为啥呢?那是因为这个
的函数原型如下所示:

因为2并不在参数列表中,根本不存在类型转换,而又因为它要求的是两个有理数类型参与运算,因此2压根不符合类型要求,所以会报错。而这就是所谓的只有被列于参数列表内,这个参数才是隐式转换的合格参与者。
那这里你一定会冒出一个疑问,既然参数列表里面只有一个参数,那你就改写一下这个重载操作符的函数呗,这样两个参数不就都能进行隐式转换了吗?嗯,这个想法是好的,不过类中的重载操作符不支持两个参数的形式,请看下面的图示:

但是非成员函数的
重载操作符函数却能支持两个参数的形式,这样两个参数都能进行隐式转换了。
那么为什么不把非成员函数设成有原函数呢?那是因为有原函数的存在极大地破坏了封装特性,不符合面向对象的思想,乱用的话会带来很大麻烦,所以能不用就不用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,583评论 9 118
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,165评论 1 51
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,495评论 1 10
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,906评论 0 4
  • 眼波流转,顾盼生姿|身不能至,心生向往 餐风饮露|衣香鬓影,环佩叮当,艳满秦河 敬天法祖,孝亲顺长,忠君爱国,尊师...
    未至水穷处阅读 3,926评论 0 1

友情链接更多精彩内容