KoreanFoodie's Study

C++ 기초 개념 5-1 : 연산자 오버로딩 (산술, 비교, 대입 연산자) 본문

Tutorials/C++ : Beginner

C++ 기초 개념 5-1 : 연산자 오버로딩 (산술, 비교, 대입 연산자)

GoldGiver 2021. 12. 22. 15:24

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요!

MyString의 '==' 연산자 오버로딩

이미 MyString class에서 compare함수를 만들었다면, 연산자 오버로딩은 간단히 구현할 수 있다.

bool MyString::operator==(const MyString& str) {
    return !compare(str);
}

 

 

대입 연산자 함수

복소수를 구현한 Complex 클래스에서 '=' 연산자 함수를 구현한다고 해 보자.

Complex& Complex::operator=(const Complex& c) {
    real = c.real;
    img = c.img;
    
    return *this;
}

왜 참조자(Complex &)로 값을 리턴하는 걸까? 왜 Complex 타입이면 안되는 걸까?

예를 들어, a = b = c; 같은 식으로 대입이 이루어진다면, 먼저 b = c 가 실행된 후, 변경된 b의 값이 a로 대입되어야 한다. 하지만 만약 Complex 타입일 경우, 불필요한 복사가 일어난다.

복사 생성자의 경우 디폴트 복사 생성자가 있었듯, 대입 연산자의 경우에도 디폴트 대입 연산자가 존재한다(얕은 복사를 수행).

대입 연산자와 마찬가지로, 사칙 연산 함수들을 구현했다고 가정하고, 대입 사칙연산 함수들(+=, -=, *=, /=)를 구현해 보자.

 

대입 사칙연산 함수

Complex& Complex::operator+=(const Complex& c) {
    *this = *this + c;
    return *this;
}

Complex& Complex::operator-=(const Complex& c) {
    *this = *this - c;
    return *this;
}

Complex& Complex::operator*=(const Complex& c) {
    *this = *this * c;
    return *this;
}

Complex& Complex::operator/=(const Complex& c) {
    *this = *this / c;
    return *this;
}

 

자기 자신을 리턴하는 이항 연산자는 멤버 함수로, 아닌 애들은 외부 함수로 정의하자!

Comments