博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++:规定24:如果所有的单位都需要的参数类型转换,使用请做到这一点non-member功能...
阅读量:6479 次
发布时间:2019-06-23

本文共 1443 字,大约阅读时间需要 4 分钟。

(一个)

如果一个class。同意整数隐式转换为”有理数似乎非常合理。

class Rational{ public:     Rational(int numerator = 0, int denominator = 1); //刻意不为explicit;同意int-to-Rational隐式转换     int numerator()const;     int denominator()const; };

在支持算术运算符时考虑该由member函数、还是non-member函数来实现:

(1)成员函数的写法:

class Rational{ public:    const Rational operator*(const Rational& rhs) const; };Rational oneEight(1,8);Rational onehalf(1,2);Rational result = oneHalf * oneEight;   //niceresult = result * oneEight;   //ok
可是你希望支持混合运算:
result = oneHalf * 2;   //ok 2发生了隐式类型转换。

result = 2 * oneHalf; //wrong !!!

编译器将上述语句转换为下面语句:

result = oneHalf.operator*(2);   //okresult = 2.operator*(oneHalf);   //wrong!

oneHalf是一个含operator*函数的class的一个对象。可是2却没有对应的class,编译器会尝试寻找可被下面这般调用的non-member operator*(也就是在命名空间内 或 global作用域内):

result = operator*(2, oneHalf);//wrong!

本例不存在这样一个接受int和Rational作为參数的non-member operator* 因此查找失败。

仅仅有当參数被列于參数列(parameter list)内,这个參数才是隐式类型转换的合格參与者

地位相当于“被调用之成员函数所隶属的那个对象”——即this对象的那个隐喻參数,绝不是隐式转换的合格參与者

(二)解决这样的问题的方法:

为了支持混合运算。让operator* 成为一个non-member函数。便同意编译器在每个实參身上运行隐式类型转换:

const Rational operator*(const Rational& lhs, const Rational& rhs) {     return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator()); }result = 2 * oneHalf;//ok。最终编译通过了!
operator*是否要成为Rational的friend函数呢?答案是否定的。由于operator*全然籍由Rational的public接口完毕任务;

不管何时假设你能够避免friend函数就该避免。

请记住:

假设你须要为某个函数的全部參数(包含被this指针所指的那个隐喻參数)进行类型转换,那么这个函数必须是个non-member。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

你可能感兴趣的文章
跨国巨头猛攻语音识别技术 让电脑听懂人们说话
查看>>
moosefs即将发布新版
查看>>
WCF4.0新特性体验(12):服务发现WS-Discovery之Managed Service Discovery
查看>>
FOSCommentBundle功能包:运行测试
查看>>
python
查看>>
SmartGit 试用过期
查看>>
c#参数传递几点小结
查看>>
python 测试驱动开发的简单例子
查看>>
JDBC中驱动加载的过程分析
查看>>
Aes 加密简单例子
查看>>
AE 线编辑
查看>>
python 回溯法 子集树模板 系列 —— 15、总结
查看>>
软件设计之UML—UML的构成[上]
查看>>
蚂蚁金服硅谷ATEC科技大会:看技术如何带来平等的机会
查看>>
[SPLEB]CodeSmith原理剖析(1)
查看>>
如何使用AdMob中介界面?
查看>>
分享一个shell脚本:通过Jumper机器来创建Jumper和target机器账号
查看>>
UITableViewCell分割线不是左对齐的问题
查看>>
CentOS7 编译安装PHP7
查看>>
MySQL常见错误代码及代码说明
查看>>