본문 바로가기

C++

[C++] operator 배열 연산자와 단항 증감 연산자

배열 연산자도 다중 정의할 수 있다.

 

#include <iostream>
using namespace std;

class TestClass
{
public:
	TestClass() {}
	~TestClass() { delete num; }

	//변환 생성자
	TestClass(int size)
	{
		num = new int[size];
		memset(num, 0, sizeof(int) * size);
	}

	int operator[](int index) const
	{
		return num[index];
	}

	int& operator[](int index)
	{
		return num[index];
	}

private:
	int *num = nullptr;
};

void TestFunc(const TestClass& a)
{
	cout << a[5] << endl;
}

int main()
{
	TestClass arr(10);
	for (int i = 0; i < 10; ++i) arr[i] = i;

	TestFunc(arr);

	return 0;
}

 

결과값:

5

 

배열 반환 값이 l-value일 수도 있고 r-value 일수도 있으므로 배열 연산자를 두 개 정의했다.

 

//일반적인 경우, l-value, r-value 모두
int operator[](int index) const{ return num[index]; }

//상수형 참조를 통해서만 호출, r-value만
int& operator[](int index){ return num[index]; }

 

TestFunc함수는 상수형 참조를 매개변수로 받아서 int& operator [] 함수를 호출한다.

 


 

i++, ++i처럼 반복문에서 많이 사용하는 당항 증감 연산자도 함수로 만들 수 있습니다.

 

주의해야 할 점은 후위 연산을 위한 ++operator() 같은 함수가 없음을 유의해야 합니다.

 

//전위식
int operator++()

//후위식
int operator++(int)

 

 

#include <iostream>
using namespace std;

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

	TestClass(int param) : num(param) {}

	operator int() { return num; }

	int operator++()
	{
		return ++num;
	}

	int operator++(int)
	{
		int newNum = num;
		num++;

		return newNum;
	}

private:
	int num = 0;
};

int main()
{
	TestClass a(10);

	cout << ++a << endl;
	cout << a++ << endl;
	cout << a << endl;

	return 0;
}

 

결과값:

11
11
12

 

전위식 후위식 모두 정상적으로 출력되는 것을 확인할 수 있습니다.