[c++] 연산자 오버로딩 - 멤버함수

파이톨치·2022년 4월 28일
0

대학수업

목록 보기
4/32

연산자 오버로딩 - 멤버함수

앞에 글에서 이어집니다.
앞에 글에서는 class 밖에다가 연산자를 정의했습니다. 그렇다면 클래스 안에다가 정의하면 어떻게 해야할까요?

몇가지 규칙이 있는 것 같습니다.
When operator is member function:
binary operators : only one parameter, not two!
calling object serves as first parameter
저는 영어를 잘 못해서 무슨 말인지 잘 모르겠지만 대충 해석하면 파라미터 1개만 써야하고, 첫번째 파라미터만 보내라는 이야기 같네요?

예를 들어서,

Money cost(1, 50), tax(0, 15), total;
total = cost + tax;

이런식으로 되어있는 경우에 +에서 cost가 calling object라는 것입니다. object tax는 single argument라고 하는데 코드를 봐야 잘 이해할 수 있을 것 같네요!

const Money operator+(const Money& amount);

오호

[클래스 내부에]
const Money operator +(const Money& amount);

[클래스 외부에]
const Money Money::operator +(const Money& secondOerand) const
{
	int allCents1 = cents + dollars * 100;
    int allCents 2 = secondOperand.cents + secondOperand.dollors * 100;
    int sumAllCents = allCents1 + allCents2;
    int absAllCents = abs(sumAllCents) / 100;
    int finalDollars = absAllCents / 100;
    int finalCents = absAllcents % 100;
    if (sumAllCents<0)
    {
    	finalDollars = -finalDollars;
        finalCents = -finalCenets;
    }
    return Money(finalDollars, finalCents);
}

생각해보면 당연한 이야기였다! 애초에 클래스 내부 맴버 함수이면 그 클래스가 가지는 변수를 사용할 수 있으니까 2번째 클래스만 받아오면 되는거였다.

Friend Function

friend 라는 키워드를 쓰면 어떻게 될까요? 이건 멤버 함수도 아니지만 private members에 대한 직접적인 접근을 가지고 있다고 합니다. 신기하네요 지금까지 배운 상식대로면 private 변수에 접근하기 위해서는 멤버 함수여야 했는데요.

Friend Function uses

연산자 오버로드에 대해 살펴보면. friend의 가장 흔한 사용이라고 합니다. 그리고 효율을 높여주고 멤버함수에 대한 호출을 피해준다고 합니다. friends는 함수가 될 수 있다고 합니다. 흠.. 여기까지 들어서는 조금 감이 안 잡히네요 역시 코드를 한번 봅시다.

class Money
{
public:
	'''
    friend const Moeny operator + (const Money& amount1, const Money& amount2);
    friend const Moeny operator - (const Money& amount1, const Money& amount2);
    friend bool Moeny operator == (const Money& amount1, const Money& amount2);
    friend const Moeny operator - (const Money& amount);
};

오! 이제 감이 좀 잡히네요! 분명 클래스 내부에서 연산자 오버로드를 하기 위해서는 변수를 1개 받아와야 했습니다. 하지만 지금 friend를 쓰면서 2개가 되었네요! 훨씬 직관적입니다.

그런 다음에 class 외부에 다음과 같이 써줍니다.

const Money operator +(const Money& amount1, const Money& amount2)
{
    int allCents1 = amount1.cents + amount1.dollars*100;
    int allCents2 = amount2.cents + amount2.dollars*100;
    int sumAllCents = allCents1 + allCents2;
    int absAllCents = abs(sumAllCents); //Money can be negative.
    int finalDollars = absAllCents/100;
    int finalCents = absAllCents%100;

    if (sumAllCents < 0)
    {
        finalDollars = -finalDollars;
        finalCents = -finalCents;
    }

    return Money(finalDollars, finalCents);
}

이렇게 하고 사용할땐

Money ourAmount = yourAmount + myAmount;

요렇게 써주기!

profile
안알랴줌

0개의 댓글