복합 대입 연산자와 마찬가지로 복합 대입 연산도 가능하도록 할 수 있다.
#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++] 상속(Inheritance) (0) | 2019.12.25 |
---|---|
[C++] operator 배열 연산자와 단항 증감 연산자 (0) | 2019.12.24 |
[C++] 연산자 함수와 operator (0) | 2019.12.21 |
[C++] 이동 생성자와 이동 시맨틱(Move semantics) (0) | 2019.12.20 |
[C++] operator 대입연산자 (0) | 2019.12.19 |