이항연산자 오버로드
멤버 연산자 함수로 이항 연산자(+, -, *, /)를 오버로드할 때는 멤버 연산자 함수 OPERATOR#()는 가인수를 하나만 가지게 된다. 이때 연산자의 우측에 놓인 객체가 멤버 연산자 함수의 가인수로 전달되며 연산자의 좌측에 놓인 객체가 멤버 연산자 함수를 호출하게 된다.
멤버 함수를 호출하면 그 멤버 함수를 호출한 객체의 시작 주소를 가리키는 포인터 this가 자동적으로 해당 멤버 함수에 전달된다. 따라서 연산자 좌측의 객체가 포인터 this에 의해 멤버 연산자 함수에 암묵적으로 전달된다.
예제 1
#include <iostream>
using namespace std;
class score {
private:
int kor;
int eng;
public:
score() { //인수가 없는 생성자 함수
kor = 0; eng = 0;
}
score(int a, int b) { //인수가 있는 생성자 함수
kor = a; eng = b;
}
void output() {
cout << "kor=" << kor << ", eng=" << eng << endl;
}
score operator+(score ob); //연산자 함수의 원형 선언
};
score score::operator+(score ob) //연산자 함수의 정의
{
score temp;
temp.kor = kor + ob.kor; //temp.kor = this->kor + ob.kor;
temp.eng = eng + ob.eng; //temp.eng = this->eng + ob.eng
return temp; //score형의 객체 반환
}
int main()
{
score ob1(90, 70), ob2(80, 70), ob3;
ob3 = ob1 + ob2; //연산자 함수의 operator 호출
cout << "ob3: ";
ob3.output();
return 0;
}
실행 결과
ob3: kor=170, eng=140
- 연산자 +를 score형 객체에 대해 오버로드 하였다.
- ob3=ob1+ob2;에서 덧셈 연산자 좌측의 객체 ob1에 의해 멤버 연산자 함수 operator+()가 호출되었다.
- 덧셈 연산자 우측에 위치한 객체 ob2가 가인수에 전달돼 ob1+ob2는 ob1.operator+(score ob2) 형태로 실행된다.
- 객체 ob1은 포인터 this에 의해 멤버 연산자 함수에 암묵적으로 전달되므로 this 포인터를 이용해서 멤버 연산자 함수 operator+()를 다시 쓸 수 있다. (코드의 각주 참고)
예제 2
#include <iostream>
using namespace std;
class score {
private:
int kor;
int eng;
public:
score() { //인수가 없는 생성자 함수
kor = 0; eng = 0;
}
score(int a, int b) { //인수가 있는 생성자 함수
kor = a; eng = b;
}
void output(int &a, int &b) { //int &a=x, int &b=y
a = kor, b = eng;
}
score operator+=(int a); //연산자 함수의 원형 선언
};
score score::operator+=(int a) //연산자 함수의 정의
{
kor += a;
eng += a;
return *this; //*this=ob1
}
int main()
{
score ob1(90, 70);
int x, y;
ob1 += 5; //ob1=ob1+5 //연산자 함수 operator+=(int) 호출
ob1.output(x, y);
cout << "kor=" << x << ", eng=" << y << endl;
return 0;
}
실행 결과
kor=95, eng=75
- 복합 대입 연산자(+=)도 오버로드 하루 수 있다.
- this는 객체 ob1의 시작 주소를 가리키므로 this는 객체 ob1자체를 나타낸다.
참고
1. 장인성 외 5인, (초보자도 쉽게 따라 할 수 있는) C++프로그래밍, 광문각, 2017.02.13
'C++ 기초 1' 카테고리의 다른 글
| [C++] 6-3 관계 연산자의 오버로드 (2) | 2024.01.08 |
|---|---|
| [C++] 6-2 단항 연산자의 오버로드 (2) | 2024.01.05 |
| [C++] 5-5 템플릿 클래스(Template class) (0) | 2024.01.03 |
| [C++] 5-4 템플릿 함수 (Template function) (1) | 2024.01.02 |
| [C++] 5-3 순수 가상 함수 (Pure virtual function) (0) | 2023.12.29 |