首先还是下面这个class;

class Rational{
public:
Rational(int numirator = ,
int denominator = );
int numurator() const;
int denominator() const; // getter;
};
想要支持operator*的时候我们首先可能想到的是两种选择,一种是member operator*(),还有一种就是friend operator*().
 
首先,member function版本的operator*带来的问题是, rational * 2可以正常使用但是 2 * rational 却不能。
所以首先这里要说的就是,所有的参数都需要进行隐式转换的情况下,采用non-member形式会更加的契合。
 
再者,如果不选去member function形式的operator*,那么是采取friend方式的operator*比较好还是说采取non friend形式的operator*方式比较好呢
 
下面首先以非friend的方式实现了这个问题:
 const Rational operator*(const Rational & lhs, const Rational & rhs)
{
return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());
//通过了两个getter来处理这件事
}

上面这种方式不仅可以使tmpRational * 2 以及2 * tmpRational正常通过编译,而且相对于friend函数来说,其对类的内部情况了解的更少,那么实际上他比下面的friend版本函数更加降低了耦合:

const Rational operator*(const Rational & lhs, const Rational & rhs)
{
return Rational(lhs.numerator * rhs.numerator, lhs.denominator * rhs.denominator);
//这里就没有使用getter来处理这件事
}
有太多的假设认为,一个与某个class相关的方法如果不是一个member function那么就应该是一个friend,实际上并不是这样,上面两种的其实上面那种确实耦合性更小。
小结:
    如果要为某个函数的所有参数进行类型转换,那么这个函数必须是个non-member,而如果能取得non-friend non-member效果其实更佳。

条款24:如果所有的参数都需要类型转换,那么请为此采用non-member函数的更多相关文章

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

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

  2. 条款24:若所有参数皆需要类型转换,请为此采用non-member函数(Declare non-member functions when type conversions should apply to all parameters)

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

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

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

  4. 读书笔记_Effective_C++_条款二十四: 若所有参数皆需类型转换,请为此采用non-member函数

    class A { private: int a; public: A(int x) :a(x){} A operator*(const A& x) { return A(a*x.a); } ...

  5. [Effective C++ --024]若所有参数皆需类型转换,请为此采用non-member函数

    引言 假设我们有这样的类: class A{ public: A(, ) {}; int num() const; int den() const; const A operator* (const ...

  6. [EffectiveC++]item24:若所有参数皆需类型转换,请为此采用non-member函数

    Declare non-member functions when type conversions should apply to all parameters. 104页 只有当参数被列于参数列( ...

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

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

  8. 若所有的参数皆需要类型转换——请为此采用non-member函数

    若所有的参数皆需要类型转换--请为此采用non-member函数 经常使用C++的程序猿(希望更多的程序媛),一般不会同意让classes支持类型转换,至于为什么,请看后续的博客.假如我们设计一个表示 ...

  9. 读书笔记_Effective_C++_条款四十六:需要类型转换时请为模板定义非成员函数

    这个条款可以看成是条款24的续集,我们先简单回顾一下条款24,它说了为什么类似于operator *这样的重载运算符要定义成非成员函数(是为了保证混合乘法2*SomeRational或者SomeRat ...

随机推荐

  1. 004-java类保存优化

    设置路径:windows→preferences→java→editer→save Actions 1.设置如下 2.可单击右侧configure配置 2.1.code organorganizing ...

  2. RTSP服务端转发服务(live555库中的testH264VideoStreamer.cpp和testOnDemandRTSPServer.cpp实例)

    1.h264文件的推送 testH264VideoStreamer.cpp文件的开头就定义了 char const* inputFileName = "test.264"; 后面接 ...

  3. jquery关于select框的取值和赋值

    jQuery("#select_id").change(function(){}); // 1.为Select添加事件,当选择其中一项时触发      var checkValue ...

  4. PAT 1119 Pre- and Post-order Traversals [二叉树遍历][难]

    1119 Pre- and Post-order Traversals (30 分) Suppose that all the keys in a binary tree are distinct p ...

  5. python全栈开发从入门到放弃之元组的内置应用

    1.元组的字符类型tuple t=(1,[1,3],'sss',(1,2)) print(type(t)) <class 'tuple'> 2.按索引号取值 t=(1,[1,3],'sss ...

  6. Delphi 正则表达式之TPerlRegEx 类的属性与方法(5): Compile、Study

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(5): Compile.Study // Compile.Study var   reg: TPerlRegEx; begin   re ...

  7. HDU - 3605 Escape (缩点+最大流/二分图多重匹配)

    题意:有N(1<=N<=1e5)个人要移民到M(1<=M<=10)个星球上,每个人有自己想去的星球,每个星球有最大承载人数.问这N个人能否移民成功. 分析:可以用最大流的思路求 ...

  8. JAVA实现redis超时失效key 的监听触发

    过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发. 而对超时的监听呢,并不需要自己发布,只有修改配置文件redis.conf中的:notify-keyspace-events Ex, ...

  9. ubuntu 16.04安装navicat for mysql

    下载地址:官网https://www.navicat.com/download 1.下载 navicat120_mysql_en_x64.tar.gz 文件  2.下载后移到/opt/下 3.解压ta ...

  10. windows 下android react native详细安装配置过程

    写在前面: 在网上搜了很多安装配置文档,感觉没有一个真的跟我安装的过程一模一样的,东拼拼西凑凑,总算是装好了,我不会告诉你,断断续续,我花了两天时间...一到黑屏报错就傻眼,幸好在react群里遇到了 ...