배열 연산자도 다중 정의할 수 있다.
#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
전위식 후위식 모두 정상적으로 출력되는 것을 확인할 수 있습니다.
'C++' 카테고리의 다른 글
[C++] 접근 제어 지시자(public, protected, private) (0) | 2019.12.25 |
---|---|
[C++] 상속(Inheritance) (0) | 2019.12.25 |
[C++] operator 복합 대입 연산자와 이동 대입 연산자 (0) | 2019.12.22 |
[C++] 연산자 함수와 operator (0) | 2019.12.21 |
[C++] 이동 생성자와 이동 시맨틱(Move semantics) (0) | 2019.12.20 |