본문 바로가기

C++

[C++] 연산자 함수와 operator

연산자 함수란?

 

연산자 함수는 연산자를 이용하듯 호출할 수 있는 메서드이다. 예를 들어 클래스에 대한 객체 a와 b가 있다면 b = a + 3; 은 문법상 오류이다. 하지만 사용자 관점에서 이러한 접근은 매우 직접적이고 알아보기 쉽다.

 

간단한 덧셈 예이다.

 

#include <iostream>
using namespace std;

class TestClass
{
public:
	TestClass() { cout << "TestClass()" << endl; }
	~TestClass() {}

	//변환 생성자
	TestClass(int param)
		: num(param){ }

	//복사 생성자
	TestClass(const TestClass& ref)
		: num(ref.num){ }
	
	//이동 생성자
	TestClass(const TestClass&& ref)
		: num(ref.num){ }

	void SetNum(int param) { num = param; }
	int GetNum() { return num; }

	//형변환 허용
	operator int() { return num; }

	TestClass operator+(const TestClass& ref)
	{
		TestClass result(0);
		result.num = this->num + ref.num;

		return result;
	}

	TestClass& operator=(const TestClass& ref)
	{
		num = ref.num;

		return *this;
	}

private:
	int num = 0;
};

int main()
{
	TestClass a(10), b(20), c(30);

	a = b + c;

	cout << a.GetNum() << endl;

	return 0;
}

 

결과값:

50

 

덧셈 결과가 정상적으로 되었음을 확인할 수 있다.

 

TestClass operator+() 함수는 덧셈을 진행하는 함수이다.

TestClass operator+(const TestClass& ref)
{
	TestClass result(0);
	result.num = this->num + ref.num;

	return result;
}

 

 

TestClass& opeartor=()함수는 대입을 진행하는 함수이다. TestClass operator+() 함수의 결과를 a에 대입하는 과정이다.

TestClass& operator=(const TestClass& ref)
{
	num = ref.num;

	return *this;
}

 

 num = ref.num; 대신 SetNum(ref.GetNum()); 해도 좋다.

 

덧셈 코드는 다르게 표현할 수 있다. 모두 같은 결과이다.

a = b + c;
a = b.operator+(c);
a.operator=(b.operator+(c));

 

 

예제의 실행 과정은 다음과 같다.

 

객체 a, b, c에 대한 TestClass(int) 생성자 3개 호출
뎃셈을 위한 operator+() 호출
뎃셈한 값을 넣기 위한 객체선언으로 TestClass(int) 생성자 호출
덧셈한 결과를 리턴하는 과정에서 TestClass(const TestClass &&) 이동 생성자 호출
대입을 위한 operator=() 호출
대입완료
이동 생성자와 뎃셈 과정에서의 객체 소멸자 호출
50출력
main() 함수 종료
객체 a, b, c에 대한 소멸자 3개 호출

 

객체 리턴 과정에서 이동 생성자 호출은 이동 생성자와 이동 시맨틱스(Move semantics)에서 봤던 것처럼 이동 생성자를 정의하지 않으면 복사 생성자가 호출될 것이다.