less than 1 minute read

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 클래스가 일반적인 배열처럼 동작하도록 만드는 중요한 부분입니다.

Tags:

Categories:

Updated:

Leave a comment