Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

게임 개발 메모장

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

언리얼 엔진/C++

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

Dev_Moses 2024. 1. 4. 09:33

 

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

 

#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

 

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

 

'언리얼 엔진 > C++' 카테고리의 다른 글

[ C++ ] static 변수와 함수  (0) 2024.01.05
[ C++ ] RTTI ( dynamic_cast )  (0) 2024.01.05
[ C++ ] operator 대입연산자  (1) 2024.01.02
[ C++ ] String 에 대해서  (0) 2024.01.02
[ C++ ] const 와 constexpr 용법  (0) 2024.01.02