페이지

2015년 1월 4일 일요일

Type 변환이 모든 Parameter에 대해 적용되어야 한다면 Non-menber function를 선언하자.

* 어떤 Function에 들어가는 모든 Parameter(this Pointer가 가리키는 객체도 포함해서)에 대해 Type 변환을 해 줄 필요가 있다면, 그 함수는 Non-member 이어야 합니다.


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) 와 같은 의미





댓글 없음:

댓글 쓰기