게임 개발 메모장
[ 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
이동 생성자와 마찬가지로 연산 과정에서 이동 대입 연산자가 호출되고 이동 대입 연산자를 정의하지 않으면 대입 연산자가 호출될 것이다. 깊은 복사보다는 얕은 복사로 효율을 올릴 수 있기 때문에 이동 대입 연산자를 사용하는 것이 좋다.
'언리얼 엔진 > 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 |