C++箴言:声明为非成员函数的时机.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

182****9516 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档