본문 바로가기

C++

[C++] operator 복합 대입 연산자와 이동 대입 연산자

복합 대입 연산자와 마찬가지로 복합 대입 연산도 가능하도록 할 수 있다.

 

#include <iostream>
using namespace std;

class TestClass
{
public:
	TestClass() {}
	~TestClass() {}

	//변환 생성자
	TestClass(int param)
	{
		num = new int;
		*num = param;
	}
	
	//형변환 허용
	operator int() { return *num; }

	//복합 대입 연산자
	TestClass& operator+=(const TestClass& ref)
	{
		//현재 값
		int* newNum = new int(*num);

		//누적 값
		*newNum += *ref.num;

		//기존 값 지우고 새 메모리 대체
		delete num;
		num = newNum;

		return *this;
	}

private:
	int *num = 0;
};

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

	a += b;
	a += c;

	cout << a << endl;

	return 0;
}

 

결과값:

30

 

복합 대입이 정상적으로 되었음을 확인할 수 있다.

 

 

 

연산 과정에서 임시 객체가 나오면서 이동 연산자가 생겼습니다. 마찬가지로 이동 대입 연산자도 생겼습니다.

 

#include <iostream>
using namespace std;

class TestClass
{
public:
	TestClass() {}
	~TestClass() {}

	//변환 생성자
	TestClass(int param)
	{
		num = new int(param);
	}

	TestClass(const TestClass& param)
	{
		num = new int(*param.num);
	}
	
	//형변환 허용
	operator int() { return *num; }

	//덧셈 연산자 다중정의
	TestClass operator+(const TestClass& ref)
	{
		return TestClass(*num + *ref.num);
	}

	//대입 연산자 다중정의
	TestClass& operator=(const TestClass& ref)
	{
		if (this == &ref) return *this;

		delete num;
		num = new int(*ref.num);
	}

	//이동 대입 연산자 다중정의
	TestClass& operator=(TestClass &&ref)
	{
		//얕은 복사 수행 후 원본은 NULL로 초기화
		num = ref.num;
		ref.num = NULL;

		return *this;
	}

private:
	int *num = nullptr;
};

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

	a = b + c;
	cout << a << endl;
	a = b;
	cout << a << endl;

	return 0;
}

 

결과값:

30
10

 

이동 생성자와 마찬가지로 연산 과정에서 이동 대입 연산자가 호출되고 이동 대입 연산자를 정의하지 않으면 대입 연산자가 호출될 것이다. 깊은 복사보다는 얕은 복사로 효율을 올릴 수 있기 때문에 이동 대입 연산자를 사용하는 것이 좋다.