연산자 함수란?
연산자 함수는 연산자를 이용하듯 호출할 수 있는 메서드이다. 예를 들어 클래스에 대한 객체 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)에서 봤던 것처럼 이동 생성자를 정의하지 않으면 복사 생성자가 호출될 것이다.
'C++' 카테고리의 다른 글
[C++] operator 배열 연산자와 단항 증감 연산자 (0) | 2019.12.24 |
---|---|
[C++] operator 복합 대입 연산자와 이동 대입 연산자 (0) | 2019.12.22 |
[C++] 이동 생성자와 이동 시맨틱(Move semantics) (0) | 2019.12.20 |
[C++] operator 대입연산자 (0) | 2019.12.19 |
[C++] 변환 생성자의 묵시적 변환과 임시 객체 explicit (0) | 2019.12.18 |