C++ 연산자 오버로딩
EX
#include <iostream>
template <typename T>
class DArray
{
size_t m_size;
T * m_arr;
public:
DArray(size_t size)
: m_size(size)
, m_arr(new T[size])
{
std::cout << "array constructor\n";
}
~DArray()
{
delete[] m_arr;
std::cout << "array destruct";
}
T get(size_t index) const
{
return m_arr[index];
}
void set(size_t index, T val)
{
m_arr[index] = val;
}
void print() const
{
for(size_t i = 0; i < m_size; i++)
{
std::cout << i << " " << m_arr[i] << "\n";
}
}
//here
T & operator [] (size_t index)
{
return m_arr[index];
}
};
int main()
{
DArray<double> arr(10);
arr.set(4, 3.14);
arr[3] = 9.9;
arr.print();
}
[]을 오버로딩하여 DArray 객체에 대해 대괄호([])를 사용하여 특정 인덱스의 요소에 접근할 수 있게 해줍니다.
위 코드에서 반환 타입이 참조형(T&)인 것을 주목하세요. 이는 operator[]가 lvalue(즉, 할당문의 왼쪽에 올 수 있는 값)로 사용될 수 있게 해줍니다. 따라서 다음과 같이 특정 인덱스 위치에 값을 할당하는 것이 가능해집니다:
만약 operator[]가 참조를 반환하지 않고 단순히 T를 반환한다면 위와 같은 코드는 작동하지 않습니다. 왜냐하면 이 경우 반환된 값은 임시 객체(temporary object)가 되어 그 위치에 값을 할당할 수 없기 때문입니다.
따라서, 주석 부분에서 정의한 연산자 오버로딩은 DArray 클래스가 일반적인 배열처럼 동작하도록 만드는 중요한 부분입니다.
Leave a comment