您甚至可以重载数组下标运算符[]。
您应该始终(99.98%的时间)实现2个版本,aconst和notconst版本,因为如果对象是const,则它应该不能修改由返回的对象[]。
参数通过const&而不是按值传递,因为按引用传递比按值传递更快,const因此运算符不会意外更改索引。
运算符按引用返回,因为根据设计,您可以修改对象的[]返回,即:
std::vector<int> v{ 1 }; v[0] = 2; //将值从1更改为2 //如果没有通过引用返回,将是不可能的
您只能在class/内重载struct:
//我是索引类型,通常是一个int T& operator[](const I& index) { //做点什么 //还东西 } //我是索引类型,通常是一个int const T& operator[](const I& index) const { //做点什么 //还东西 }
[][]...可以通过代理对象实现多个下标运算符。以下是一个简单的行占主导的矩阵类的示例演示了这一点:
template<class T> class matrix { // 启用[] []重载的类以访问矩阵元素 template <class C> class proxy_row_vector { using reference = decltype(std::declval<C>()[0]); using const_reference = decltype(std::declval<C const>()[0]); public: proxy_row_vector(C& _vec, std::size_t _r_ind, std::size_t _cols) : vec(_vec), row_index(_r_ind), cols(_cols) {} const_reference operator[](std::size_t _col_index) const { return vec[row_index*cols + _col_index]; } reference operator[](std::size_t _col_index) { return vec[row_index*cols + _col_index]; } private: C& vec; std::size_t row_index; // 要访问的行索引 std::size_t cols; // 矩阵中的列数 }; using const_proxy = proxy_row_vector<const std::vector<T>>; using proxy = proxy_row_vector<std::vector<T>>; public: matrix() : mtx(), rows(0), cols(0) {} matrix(std::size_t _rows, std::size_t _cols) : mtx(_rows*_cols), rows(_rows), cols(_cols) {} // 调用operator [],然后再进行另一个[]调用,以访问矩阵元素 const_proxy operator[](std::size_t _row_index) const { return const_proxy(mtx, _row_index, cols); } proxy operator[](std::size_t _row_index) { return proxy(mtx, _row_index, cols); } private: std::vector<T> mtx; std::size_t rows; std::size_t cols; };