c语言重载例子,C++重载[](下标运算符)详解

本文介绍了C++中如何为自定义类重载下标运算符[],以实现变长数组的功能。通过提供非const和const版本的operator[],使得既能读取又能修改数组元素,同时也支持const对象的访问。示例代码展示了Array类的定义和使用,以及如何在main函数中创建并显示数组内容。在旧版编译器不支持变长数组的情况下,这样的自定义类可以作为替代方案。
摘要由CSDN通过智能技术生成

C++ 规定,下标运算符[ ]必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下:

返回值类型 & operator[ ] (参数);

或者:

const 返回值类型 & operator[ ] (参数) const;

使用第一种声明方式,[ ]不仅可以访问元素,还可以修改元素。使用第二种声明方式,[ ]只能访问而不能修改元素。在实际开发中,我们应该同时提供以上两种形式,这样做是为了适应 const 对象,因为通过 const 对象只能调用 const 成员函数,如果不提供第二种形式,那么将无法访问 const 对象的任何元素。

下面我们通过一个具体的例子来演示如何重载[ ]。我们知道,有些较老的编译器不支持变长数组,例如 VC6.0、VS2010 等,这有时候会给编程带来不便,下面我们通过自定义的 Array 类来实现变长数组。

#include

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<

}else{

cout<

}

}

}

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<

return 0;

}

运行结果:

5↙

0, 5, 10, 15, 20

33685536

重载[ ]运算符以后,表达式arr[i]会被转换为:

arr.operator[ ](i);

需要说明的是,B 是 const 对象,如果 Array 类没有提供 const 版本的operator[ ],那么第 60 行代码将报错。虽然第 60 行代码只是读取对象的数据,并没有试图修改对象,但是它调用了非 const 版本的operator[ ],编译器不管实际上有没有修改对象,只要是调用了非 const 的成员函数,编译器就认为会修改对象(至少有这种风险)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值