C++에서 첨자 연산자 오버로드

Jinku Hu 2023년10월12일
C++에서 첨자 연산자 오버로드

이 기사에서는 C++에서 첨자/인덱스 연산자를 오버로드하는 방법을 보여줍니다.

C++에서 operator[] 표기법을 사용하여 첨자 연산자 오버로드

연산자 오버로딩은 C++ 언어의 강력한 기능입니다. 이것은 프로그래머에게 사용자 정의 클래스에 대한 기존 연산자의 의미를 재정의할 수 있는 기능을 제공합니다. 기본적으로 오버로드된 연산자는 함수이며 특수 이름이 있다는 점을 제외하고는 함수로 정의됩니다. 이름은 접두사 operator로 시작하고 그 뒤에 오버로드되는 연산자 기호가 와야 합니다.

일반적으로 연산자 오버로드 함수에는 지정된 연산자의 피연산자와 동일한 수의 매개변수가 있습니다. 따라서 아래 첨자 연산자 오버로드는 두 개의 매개변수를 허용합니다. 다음 예제 코드는 내부 vector 구조에서 요소 액세스 작업을 수행하고 요소에 대한 참조를 반환하는 operator[] 멤버 함수가 있는 MyClass 클래스 구현을 보여줍니다. MyClass는 기본적으로 std::vector 컨테이너 주변의 래퍼 클래스이며 데모를 위해 여러 멤버 함수를 제공합니다.

operator[] 멤버 함수에는 일반적인 첨자 연산자로 하나의 매개변수가 있습니다. 그러나 연산자 함수가 멤버 함수로 선언되면 암시적 this 포인터에 바인딩된 첫 번째 매개 변수가 있습니다. 따라서 멤버 함수로 선언된 연산자 오버로드에 대한 피연산자보다 매개 변수가 하나 적을 수 있습니다.

#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
class MyClass {
 public:
  MyClass() = default;
  explicit MyClass(const T &data) { vec.push_back(data); };
  MyClass(std::initializer_list<T> list) {
    vec.insert(vec.end(), list.begin(), list.end());
  };

  void push_back(const T &data) { vec.push_back(data); };

  void pop_back() { vec.pop_back(); };

  size_t size() { return vec.size(); };

  T &operator[](size_t pos) { return vec.at(pos); };

  const T &operator[](size_t pos) const { return vec.at(pos); };

 private:
  vector<T> vec;
  string name;
};

int main() {
  MyClass<string> m1 = {"top", "mop", "gop", "sop"};

  for (size_t i = 0; i < m1.size(); ++i) {
    cout << m1[i] << endl;
  }

  cout << "/ ------------------- /" << endl;

  m1.pop_back();
  m1.pop_back();

  for (size_t i = 0; i < m1.size(); ++i) {
    cout << m1[i] << endl;
  }

  return EXIT_SUCCESS;
}

출력:

top
mop
gop
sop
/ ------------------- /
top
mop

일부 연산자는 멤버 함수로 오버로드되어야 하며 그 중 하나는 첨자 연산자입니다. operator[] 함수는 주어진 위치에서 요소를 검색하는 내장 연산자와 유사한 의미를 갖는 것이 좋습니다. 아래 첨자 오버로드는 할당의 양쪽에서 사용할 참조를 반환해야 합니다. 또한 operator[] 함수의 두 가지 버전을 정의하는 것이 중요합니다. 하나는 비 const 개체용이고 다른 하나는 const 개체용입니다. 객체 자체가 const 자격이 있습니다.

작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Operator