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
자격이 있습니다.
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