`
kmplayer
  • 浏览: 512682 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条款19:区分member function,non-member function和firend functions三者

 
阅读更多
1,成员函数和非成员函数最大的区别:前者可以是虚拟函数,而后者不可以。
2,关于成员函数和非成员函数:
例子:
class Rational
{

public:

Rational(int numerator = 0, int denominator = 1);

int numerator() const;

int denominator() const;
....
const Rational operator*(const Rational& rhs) const;



private:

  ...

};


注意下面的调用:
Rational oneEighth(1,;

Rational oneHalf(1, 2);

Rational result = oneHalf * oneEighth;      // fine

result = result * oneEighth;                // fine


result = oneHalf * 2;      // fine
等价于:
result = oneHalf.operator*(2);//这里2发生了隐式转换

result = 2 * oneHalf;      // error!
等价于:

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



如果这么定义:
class Rational
{

public:

explicit Rational(int numerator = 0, int denominator = 1);
...
};

result = oneHalf * 2;      // error
等价于:
result = oneHalf.operator*(2);//这里2发生了隐式转换

3,因为需要满足乘法的交换律,因此可以将operator*设置为非成员函数。
如:
const Rational operator*(const Rational& lhs, const Rational& rhs)

{

return Rational(lhs.numerator() * rhs.numerator(),

          lhs.denominator() * rhs.denominator());

}

Rational oneFourth(1, 4);

Rational result;

result = oneFourth * 2;           // fine

result = 2 * oneFourth;           // hooray, it works!

4,只要能够避免friend函数,就应该尽量避免。朋友带来的价值往往多于其价值。

5,总结:
(1)虚拟函数必须是成员函数。
(2)绝不要让operator>>和operator<<成员成员函数。
(3)只有非成员函数才能在其最左端参数身上实施型别转换。
(4)上述之外的每一种情况,都应该设计成员函数。
分享到:
评论

相关推荐

    史上最为详细的javascript继承(推荐)

    JavaScript 继承是面向对象编程中的关键概念,它允许创建基于现有对象的新对象,从而能够复用和扩展已有功能。本文将深入探讨JavaScript中的几种继承方式,包括它们的基本原理、优缺点以及适用场景。 首先,原型链...

    人教版小学四年级英语上册期末试题(含答案).pdf

    - 重组单词:让学生识别并重新组合单词,如byo -&gt; boy,gril -&gt; girl,firend -&gt; friend,rluer -&gt; ruler,pencil-csae -&gt; pencil-case。 - 完成单词并连线:要求学生完成单词拼写并与相应的图片匹配,如te__cher...

    xtream解析xml

    在给定的部分内容中,展示了三个主要的Java类:`Person`, `Firend`, 和 `PhoneNumber`。这些类的设计体现了面向对象编程的原则,包括封装、继承和多态。每个类都有其属性(如`firstname`, `lastname`, `phone`等)和...

    新剑桥少儿英语一级LessonMynewfriendPPT课件.pptx

    新剑桥少儿英语一级LessonMynewfriendPPT课件.pptx

    鬼客漏洞扫描器.rar

    firend.mdb database/NewCloud6.mdb database/PowerEasy4.mdb blogdata/L-BLOG.mdb database/bbsxp.mdb access/sf2.mdb data/Leadbbs.mdb bbs/Data/LeadBBS.mdb bbs/access/sf2.mdb bbs/database/bbsxp.mdb blog/...

    Friends:Bukkit 插件

    朋友们 Friends 是一个 Bukkit 插件。 ##Feature 您可以通过键入命令来交朋友。 并显示朋友的信息。 别担心,你可以移除好友!!xD ##如何使用? 下载 .jar 并复制并粘贴到您... /firend list :显示你的好友列表。

Global site tag (gtag.js) - Google Analytics