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

巴黎樱桃花

巴黎樱桃花

2016-02-19 18:35

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是C++箴言:声明为非成员函数时机,一起来学习了解下吧!

  我谈到让一个类支持隐式类型转换通常是一个不好的主意。当然,这条规则有一些例外,最普通的一种就是在创建数值类型时。例如,假如你设计一个用来表现有理数的类,答应从整数到有理数的隐式转换看上去并非不合理。 !-- frame contents -- !-- /frame contents -- 这的确不比 C++ 的内建类型从 int 到 double 的转换更不合理(而且比 C++ 的内建类型从 double 到 int 的转换合理得多)。在这种情况下,你可以用这种方法开始你的 Rational 类:
  
  
  
  class Rational {
  
   public:
  
  Rational(int numerator = 0, // ctor 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& rhs) const;
  
  };
  
  (假如你不能确定为什么这个函数声明为这个样子——返回一个 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!
  
  这是一个不好的征兆。乘法必须是可交换的,记得吗?
   !-- frame contents -- !-- /frame contents --
  当你重写最后两个例子为功能等价的另一种形式时,问题的
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
C++箴言:声明为非成员函数时机

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

编程语言 网络编程
C++箴言:声明为非成员函数的时机

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

C++类静态数据成员与类静态成员函数

编程语言 网络编程
C++类静态数据成员与类静态成员函数

C++基础:常量成员函数特殊说明

编程语言 网络编程
C++基础:常量成员函数特殊说明

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

C#箴言:用静态构造函数初始化静态成员

编程语言 网络编程
C#箴言:用静态构造函数初始化静态成员

C++箴言:理解Terminology术语

编程语言 网络编程
C++箴言:理解Terminology术语

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win10系统下如何快递打开注册表

Win10系统下如何快递打开注册表

Win10电脑登录时蓝屏怎么办

Win10电脑登录时蓝屏怎么办
下拉加载更多内容 ↓