首先还是下面这个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. jQuery.extend()、jQuery.fn.extend()扩展方法具体解释

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/dreamsunday/article/details/25193459 jQuery自己定义了jQu ...

  2. pandas(三)汇总和计算描述统计

    pandas对象有一些常用的数学和统计的方法,大部分都属于约简或汇总统计. SUM方法 DataFrame对象的sum方法,返回一个含有列小计的Series >>> df = Dat ...

  3. jdk1.7 ArrayList源码浅析

    参考:http://www.cnblogs.com/xrq730/p/4989451.html(借鉴的有点多,哈哈) 首先介绍ArrayList的特性: 1.允许元素为空.允许重复元素 2.有序,即插 ...

  4. beego——过滤器

    beego支持自定义过滤中间件,例如安全验证.强制跳转等. 过滤器函数如下所示: beego.InsertFilter(pattern string, position int, filter Fil ...

  5. How to make TWebBrowser get focus in Delphi

    How to make TWebBrowser get focus in Delphi   Written by Administrator       Tags: Delphi Twebbrowse ...

  6. What is CRC and how does it works?

    What is CRC and how does it works? CRC errors refer to Layer 1 or 2 issues. Two things you should ch ...

  7. Cocos2d-x项目移植到WP8系列之九:使用自定义shader

    本文原链接:http://www.cnblogs.com/zouzf/p/3995132.html 有时候想得到一些例如灰度图等特殊的渲染效果,就得用到自定义shader,关于shader的一些背景知 ...

  8. 《React-Native系列》RN与native交互与数据传递

    RN怎么与native交互的呢? 下面我们通过一个简单的Demo来实现:RN页面调起Native页面,Native页面选择电话本数据,将数据回传给RN展示. 首先是 Native侧 1.MainAct ...

  9. ES6 Babel 简单使用

    ECMAScript 是 JS 的语言标准.而 ES6 是新的 JS 语法标准. PS:严格来说,ECMAScript 还包括其他很多语言的语言标准. ECMAScript 发展历史 1995年:EC ...

  10. TrappingRainWater

    问题描述: Given n non-negative integers representing an elevation map where the width of each bar is 1, ...