C++重载[](下标运算符)详解
C++ 规定,下标运算符
下面我们通过一个具体的例子来演示如何重载
5↙
0, 5, 10, 15, 20
33685536
重载
[ ]
必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下:
返回值类型 & operator[ ] (参数);
或者:const 返回值类型 & operator[ ] (参数) const;
使用第一种声明方式,[ ]
不仅可以访问元素,还可以修改元素。使用第二种声明方式,[ ]
只能访问而不能修改元素。在实际开发中,我们应该同时提供以上两种形式,这样做是为了适应 const 对象,因为通过 const 对象只能调用 const 成员函数,如果不提供第二种形式,那么将无法访问 const 对象的任何元素。下面我们通过一个具体的例子来演示如何重载
[ ]
。我们知道,有些较老的编译器不支持变长数组,例如 VC6.0、VS2010 等,这有时候会给编程带来不便,下面我们通过自定义的 Array 类来实现变长数组。
#include <iostream> using namespace std; class Array{ public: Array(int length = 0); ~Array(); public: int & operator[](int i); const int & operator[](int i) const; public: int length() const { return m_length; } void display() const; private: int m_length; //数组长度 int *m_p; //指向数组内存的指针 }; Array::Array(int length): m_length(length){ if(length == 0){ m_p = NULL; }else{ m_p = new int[length]; } } Array::~Array(){ delete[] m_p; } int& Array::operator[](int i){ return m_p[i]; } const int & Array::operator[](int i) const{ return m_p[i]; } void Array::display() const{ for(int i = 0; i < m_length; i++){ if(i == m_length - 1){ cout<<m_p[i]<<endl; }else{ cout<<m_p[i]<<", "; } } } int main(){ int n; cin>>n; Array A(n); for(int i = 0, len = A.length(); i < len; i++){ A[i] = i * 5; } A.display(); const Array B(n); cout<<B[n-1]<<endl; //访问最后一个元素 return 0; }运行结果:
5↙
0, 5, 10, 15, 20
33685536
重载
[ ]
运算符以后,表达式arr[i]
会被转换为:
arr.operator[ ](i);
需要说明的是,B 是 const 对象,如果 Array 类没有提供 const 版本的operator[ ]
,那么第 60 行代码将报错。虽然第 60 行代码只是读取对象的数据,并没有试图修改对象,但是它调用了非 const 版本的operator[ ]
,编译器不管实际上有没有修改对象,只要是调用了非 const 的成员函数,编译器就认为会修改对象(至少有这种风险)。所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算