다음과 같은 클래스가 있다.
class Rational {
public:
Rational(int numerator =0, int denominator = 1);//생성자에 일부러 explicit을 붙이지 않음. int -> Rational로의 암시적 변환을 허용하기 위해.
//분자 및 분모에 대한 접근용 함수
int numerator() const;
int denominator() const;
private:
...
};
만약 곱셈을 다음과 같이 멤버 함수로 선언한다면,
class Rational {
public:
...
const Rational operator* (const Rational& rhs) const;
};
Rational result = oneHalf * oneEight;
result = oneHalf * 2;는 괜찮지만,
result = 2 * oneHalf;와 같은 연산은 에러를 뱉는다.
2는 매개변수가 아니기 때문에, 암시적 형변환을 해주지 않기 때문이다.
따라서 이처럼 타입 변환이 연산자의 좌우에 모두 암시적으로 시행되어야 하는 경우, 비멤버 함수로 다음과같이 선언하자.
const Rational operator* (const Rational& lhs, const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());
}
또한 이처럼 public함수만으로 정의 가능한 비멤버 함수는 반드시 비프렌드로 만들자.