class Rational { // 유리수 public: // 생성자에 일부러 explicit를 붙이지 않았다. // int에서 Rational로의 암시적 변환을 허용하기 위해서 Rational(int numerator = 0, int denominator = 1); int numerator() const; int denominator() const; ... };
위와 같은 유리수를 나타내는 Class를 생성했다. 곱하기 연산을 Member function으로 구현했을 경우 아래와 같은 문제점이 있다.
class Rational { // 유리수 public: const Rational operator*(const Rational& rhs) const; }; Rational oneHalf(1, 2); Rational result = oneHalf * 2; // OK oneHalf * Rarional(2) 와 같은 의미 result = 2 * oneHalf // Error // 2.operator*(oneHalf) 도 Error // operator*(2, oneHalf)도 Error
하지만 곱하기 연산을 Non-member function으로 구현하면 모든 문제가 해결된다.
class Rational { ... } ; const Rational operator*(const Rational& lhs, const Rational& rhs) { return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator()); } Rational oneHalf(1, 2); Rational result = oneHalf * 2; // OK operator*(oneHalf, Rarional(2)) 와 같은 의미 result = 2 * oneHalf // OK operator*(Rarional(2), oneHalf) 와 같은 의미
댓글 없음:
댓글 쓰기