(一个)

如果一个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; //nice
result = result * oneEight; //ok

可是你希望支持混合运算:

result = oneHalf * 2;   //ok 2发生了隐式类型转换。

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

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

result = oneHalf.operator*(2);   //ok
result = 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。

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

最新文章

  1. linux下cmake编译安装、配置和卸载mysql
  2. python学习应用笔记(一)
  3. VIM 技巧 (一)全文统一添加
  4. HTML之正则表达式
  5. UVA 558 Wormholes
  6. 《paste命令》-linux命令五分钟系列之二十
  7. Oracle EBS-SQL (SYS-2): sys_在线用户查询.sql
  8. Restify —— 在Node.js中构建正确的REST Web服务
  9. 游戏UI框架设计(7): 资源国际化技术
  10. [翻译] 对正在使用EF6x开发人员的一些话
  11. 简单实现 C# 与 Javascript的兼容
  12. Jenkins+Ansible+Gitlab自动化部署三剑客-gitlab本地搭建
  13. c#大文件的拷贝
  14. [译]MediatR, FluentValidation, and Ninject using Decorators
  15. Linux命令第一篇
  16. CoAP 协议解析说明(转)
  17. ubuntu-docker入门到放弃(七)Dockerfile简介
  18. SSH登录启用Google二次身份验证
  19. 《数据库系统概念》10-ER模型
  20. WPF 矩形框8个控制点伸缩及拖拽

热门文章

  1. centos7 安装php环境和安装swoole
  2. java异常——捕获异常+再次抛出异常与异常链
  3. ios开发多线程四:NSOperation多图下载综合案例
  4. Tomcat生产中优化JVM的配置实例
  5. Java多线程系列-线程创建
  6. [React Native] Animate Styles of a React Native View with Animated.timing
  7. source insight 添加自定义macro
  8. 【Windows Defender Antivirus Service 永久禁用 】
  9. HDoj-1874-畅通project续-Dijkstra算法
  10. 【25.47%】【codeforces 733D】Kostya the Sculptor