프로그래머/CPP_메모

c++ 연산자 오버로딩 정리

미역국마싯 2022. 4. 3. 21:20

목차

연산자 오버로딩

  1. 멤버 함수 방식 - 대입 연산자 오버로딩
  2. 전역 함수 방식

연산자 오버로딩

멤버와 전역 함수 방식 중 하나만 지원하는 연산자도 있으니 둘 다 알도록 한다.

1. 멤버 함수 방식

대입 연산자( a = b )는 멤버 함수 방식으로만 구현할 수 있다.

// 대입 연산자 x, 선언 및 초기화
int a = 0;
int b = 1;

// 대입 연산자
a = b;

class Exam
{
public:
	Exam operator+(const Exam& e)
	{
		Exam exam;
		exam.x = x + e.x;       // Exam a 를 기준으로 한다. 
		exam.y = y + e.y;        
		return exam;        
	}
private:
	int x;
	int y;    
};

int main()
{
	Exam a;
	Exam b;
	Exam c = a + b;    
	Exam d = a.operator+(b);    
}

멤버 함수처럼 class 내부에 구현하는 방식이다.

operator 뒤에 원하는 연산자를 붙여서 오버로딩한다. 그런데 인자는 왜 하나인지 궁금할 수 있다.

이는 main에서 정의한 a가 operator의 기준이 되고 b가 인자로 넘겨지기 때문이다.

따라서 operator+ 함수 내에 존재하는 멤버 변수 x와 y는 Exam a의 멤버 변수임을 알 수 있다.

 

주의할 점은 a가 클래스가 아닌 경우 멤버 함수 방식을 이용해서 연산할 수 없다.

class Exam
{
public:
	Exam operator+(int e)
	{
		Exam exam;
		exam.x = x + e;
		exam.y = y + e;        
		return exam;        
	}
...    
}    

int main()
{
	Exam a;
	Exam b;
	Exam c = a + 1;
	Exam d = 1 + b;	// error    
}

이해를 돕기 위해서 새로운 함수를 생성했다.

1 + b로 연산자 오버로딩 함수를 사용할 수 없다고 나올 것이다.

왜냐하면 멤버 함수 방식은 왼쪽 " 클래스 " 를 기준으로 연산하기 때문이다. 문법인 것 같다.

 

대입 연산자 오버로딩

class Exam
{
	// 1
	void operator=(int i)
	{
		x = i;
		y = i;
	}
	// 2
	Exam& operator=(int i)
	{
		x = i;
		y = i;
		return *this;	// Exam* this = 자신의 주소;
	}
...
};

int main()
{
	Exam a;
	Exam b;
	a = 5;	 // 1
	Exam c;
	c = (b = 3); // 2
}

대입 연산자를 사용할 때, 선언 및 초기화와 헷갈릴 수 있으니 주의하자.

 

2. 전역 함수 방식

모든 피연산자를 인자로 받는다.

class Exam
{
public:
	friend Exam operator+(int a, const Exam& b);
...
};

Exam operator+(int a, const Exam& b)
{
	Exam exam;
	exam.x = b.x + a; // friend를 사용하지 않으면, x와 y에 접근할 수 없다.
	exam.y = b.y + a;
	return exam;    
}

이렇게 구현하면 멤버 함수 방식에서 성공하지 못했던 1 + b를 빌드할 수 있게 된다.

여기서 접근 제어 지시자인 friend를 사용해야 클래스 밖에서 Exam의 멤버 변수를 사용할 수 있게 된다.

즉, friend를 붙여서 클래스 내부에 선언하고, 구현은 클래스 외부에 하는 것이다.

 

 

'프로그래머 > CPP_메모' 카테고리의 다른 글

Uniform Initialization  (0) 2023.05.04
모듈러 연산( modular, 나머지 )  (0) 2022.04.21
c++ 배열 정리  (0) 2022.03.21
c++ 참조 정리  (0) 2022.03.20
c++ 포인터 정리  (0) 2022.03.20