본문 바로가기

C++ 기초 1

[C++] 6-1 이항연산자의 오버로드

이항연산자 오버로드

   멤버 연산자 함수로 이항 연산자(+, -, *, /)를 오버로드할 때는 멤버 연산자 함수 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