- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++箴言:声明为非成员函数的时机
public:
Rational(int numerato = 0, // cto is deliberately not
explicit;
int denominator = 1); // allows implicit int-to-Rational
// conversions
int numerator() const; // Accessors for numerator and
int denominator() const; // denominator - see Item 22
private:
...
};
你知道你应当支持类似加,乘等算术运算,但是你不确定你应当通过
成员函数还是非成员函数,或者,非成员的友元函数来实现它们。你的直
觉告知你,当你拿不准的时候,你应当坚持面对对象。你知道这些,于是
表示,有理数的乘法与 Rational 类相关,所以在 Rational 类内部为有
理数实现 operator* 好像更加正常。与直觉不符,将函数放置在它们所
关联的类的内部的办法有时候与面对对象的原则正好相反,但是让我们将
它放到一边,来讨论一下将 operator* 作为 Rational 的一个成员函数
的办法:
class Rational {
public:
...
const Rational operator*(const Rational
};
(假如你不能确定为什么这个函数声明为这个样子——返回一个
const by-value 的结果,却持有一个 reference-to-const 作为它的参
数。)
这个设计让你在有理数相乘时不费吹灰之力:
Rational oneEighth(1, 8);
Rational oneHalf(1, 2);
Rational result = oneHalf * oneEighth; // fine
result = result * oneEighth; // fine
但是你并不感到满足。你还盼望支持混合模式的操作,以便让
Rationals 能够和其它类型(例如,int)相乘。究竟,很少有事情像两
个数相乘那么正常,即使它们碰巧是数字的不同类型。
当你试图做混合模式的算术运算时,可是,你发觉只有一半时间它能
工作:
result = oneHalf * 2; // fine
result = 2 * oneHalf; // error!
这是一个不好的征兆。乘法必需是可交换的,记得吗?
当你重写最终两个例子为功能等价的另一种形式时,问题的来源就变
得很明显了:
result = oneHalf.operator*(2); // fine
result = 2.operator*(oneHalf); // error!
对象 oneHalf 是一个包含 operator* 的类的实例,所以编译器调用
那个函数。然而,整数 2 与类没有关系,因而没有 operator* 成员函数。
编译器同样要查找能如下调用的非成员的 operator*s (也就是说,在
namespace 或全局范围内的 operator*s):
result = operator*(2, oneHalf); // error!
但是在本例中,没有非成员的持有一个 int 和一个 Rational 的
operator*,所以搜寻失败。
再看一眼那个胜利的调用。你会发觉它的其次个参数是整数 2,然而
Rational::operator* 却持有一个 Rational 对象作为它的参数。这里发
生了什么呢?为什么 2 在一个位置能工作,在其它地方却不行呢?
原创力文档


文档评论(0)