C++ 中的重载下标运算符
Jinku Hu
2023年10月12日
本文将演示如何在 C++ 中重载下标/索引运算符。
运算符重载是 C++ 语言的一个强大功能。它为程序员提供了为任何用户定义的类重新定义现有运算符的含义的便利。从本质上讲,重载运算符是函数,并且是这样定义的,只是它们具有特殊的名称。名称必须以前缀 operator
开头,后跟正在重载的运算符符号。
通常,运算符重载函数具有与给定运算符的操作数相同数量的参数。因此,我们的下标运算符重载将接受两个参数。下面的示例代码演示了一个 MyClass
类实现,它具有 operator[]
成员函数,该函数对内部 vector
结构进行元素访问操作并返回对元素的引用。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