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中的几种继承方式,包括它们的基本原理、优缺点以及适用场景。 首先,原型链...
- 重组单词:让学生识别并重新组合单词,如byo -> boy,gril -> girl,firend -> friend,rluer -> ruler,pencil-csae -> pencil-case。 - 完成单词并连线:要求学生完成单词拼写并与相应的图片匹配,如te__cher...
在给定的部分内容中,展示了三个主要的Java类:`Person`, `Firend`, 和 `PhoneNumber`。这些类的设计体现了面向对象编程的原则,包括封装、继承和多态。每个类都有其属性(如`firstname`, `lastname`, `phone`等)和...
新剑桥少儿英语一级LessonMynewfriendPPT课件.pptx
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 插件。 ##Feature 您可以通过键入命令来交朋友。 并显示朋友的信息。 别担心,你可以移除好友!!xD ##如何使用? 下载 .jar 并复制并粘贴到您... /firend list :显示你的好友列表。