(一个)

如果一个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。

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

Effective C++:规定24:如果所有的单位都需要的参数类型转换,使用请做到这一点non-member功能的更多相关文章

  1. Effective C++ -----条款24:若所有参数皆需类型转换,请为此采用non-member函数

    如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.

  2. Effective C++ 条款24

    若全部參数皆需类型转换,请为此採用non-member函数 我们直奔主题 假设你定义一个有理数类例如以下 class Rational{ public: Rational(int numerator= ...

  3. 读书笔记 effective c++ Item 24 如果函数的所有参数都需要类型转换,将其声明成非成员函数

    1. 将需要隐式类型转换的函数声明为成员函数会出现问题 使类支持隐式转换是一个坏的想法.当然也有例外的情况,最常见的一个例子就是数值类型.举个例子,如果你设计一个表示有理数的类,允许从整型到有理数的隐 ...

  4. Javascript、Jquery获取浏览器和屏幕各种高度宽度(单位都为px)

    Javascript.Jquery获取浏览器和屏幕各种高度宽度 另外参见    http://www.cnblogs.com/top5/archive/2009/05/07/1452135.html ...

  5. effective java 3th item2:考虑 builder 模式,当构造器参数过多的时候

    yiaz 读书笔记,翻译于 effective java 3th 英文版,可能有些地方有错误.欢迎指正. 静态工厂方法和构造器都有一个限制:当有许多参数的时候,它们不能很好的扩展. 比如试想下如下场景 ...

  6. Effective C++ -----条款46:需要类型转换时请为模板定义非成员函数

    当我们编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template内部的friend函数”.

  7. [Effective JavaScript 笔记]第22条:使用arguments创建可变参数的函数

    第21条讲述使用可变参数的函数average.该函数可处理任意数量的参数并返回这些参数的平均值. 如何创建可变参数的函数 1.实现固定元数的函数 书上的版本 function averageOfArr ...

  8. [Effective Java]第三章 对所有对象都通用的方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. 【24】若所有参数皆需类型转换,请为此采用non-members函数

    1.令class支持隐式类型转换,往往是个糟糕的主意.但有些情况是合理的,比如数值类型.考虑,有理数Rational有分子,分母两个字段,缺省参数值为0,1.Ration a = 2;我们期望构造一个 ...

随机推荐

  1. windows下perl使用

    windows下perl使用 windows下perl开发工具 Perl 的官方网址提供下载的windows perl开发环境 ActiveState Perl Strawberry Perl DWI ...

  2. css3-9 css中的浮动怎么使用

    css3-9 css中的浮动怎么使用 一.总结 一句话总结:用来做一般的行效果,比如说手机左右分布的头部导航栏.浮动的东西放到一个div中去,里面的内容根据需求左浮动或者右浮动,然后记得加上清除浮动. ...

  3. Spring ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别

    http://www.lai18.com/content/9755931.html Spring 容器(Spring 的上下文) https://my.oschina.net/jast90/blog/ ...

  4. UUIDUtils工具类

    原理是根据自身的操作系统和电脑硬件生成的一个32位的随机字符串,如果是一台电脑使用的话,一年不会重复,经过java之后貌似编程了36位,多了4个"-",下面是代码实现: impor ...

  5. Android NDK对象的引用-全局引用,局部引用,弱引用

    百度了一下,google了一下,关于NDK引用的介绍无10篇中就有9.9篇是相同的,对于这种问题,我只能呜呼哀哉了!! 局部引用(函数内部对象类型变量):在C或C++中,局部变量表示只运行范围局限在该 ...

  6. JFinal redis cluster集群插件

    JFinal redis cluster集群插件 JFinal 框架到了2.1版本号,可是依旧仅仅支持redis的主从集群,没有看到Cluster集群的插件.笔者照着主从的插件方式,改了改,实现了个简 ...

  7. BZOJ 1509 逃学的小孩 - 树型dp

    传送门 题目大意: 在一棵树中, 每条边都有一个长度值, 现要求在树中选择 3 个点 X.Y. Z , 满足 X 到 Y 的距离不大于 X 到 Z 的距离, 且 X 到 Y 的距离与 Y 到 Z 的距 ...

  8. Python 第三方库 cp27、cp35 等文件名的含义

    What does version name 'cp27' or 'cp35' mean in Python? 如对于 gensim-0.12.4-cp27-none-win_amd64.whl文件名 ...

  9. hexo的url路径修改以及发布与修改时间

    hexo默认url是年/月/日,这样其实不利于SEO.hexo生成新文章命令,hexo new [layout] <title>,这个title最好是英文的,因为我们要把这个title放在 ...

  10. mac下通过brew安装的Nginx在哪

    反正我的是在/usr/local/etc下,看网上的资料似乎都不太一样. 一些常用nginx命令 nginx -s reload :修改配置后重新加载生效 nginx -s stop :快速停止ngi ...