宁波网站设计皆选蓉胜网络,上海广告推广,黄山旅游必去十大景点,如何用自家电脑做网站服务器C 规定#xff0c;下标运算符[ ]必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下#xff1a;
返回值类型 operator[ ] (参数);或者#xff1a;
const 返回值类型 operator[ ] (参数) const;使用第一种声明方式#xff0c;[ ]不仅可以访问元素…C 规定下标运算符[ ]必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下
返回值类型 operator[ ] (参数);或者
const 返回值类型 operator[ ] (参数) const;使用第一种声明方式[ ]不仅可以访问元素还可以修改元素。使用第二种声明方式[ ]只能访问而不能修改元素。在实际开发中我们应该同时提供以上两种形式这样做是为了适应 const 对象因为通过 const 对象只能调用 const 成员函数如果不提供第二种形式那么将无法访问 const 对象的任何元素。
示例重载[]利用自定义的 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){coutm_p[i]endl;}else{coutm_p[i], ;}}
}int main(){int n;cinn;Array A(n);for(int i 0, len A.length(); i len; i){A[i] i * 5;}A.display();const Array B(n);coutB[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 的成员函数编译器就认为会修改对象。