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){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++重载下标运算符相关推荐

  1. C++中重载下标运算符[]

    1.C++中重载下标运算符[] C++规定,下标运算符[]必须以成员函数的形式进行重载,该重载函数在类中的声明格式如下: 返回值类型 & operator[] (参数列表);// 或者cons ...

  2. C++知识点42——下标运算符[]的重载及string类的实现

    一.下标运算符的重载 1.概念 如果一个类表示容器,那么要重载下标运算符[],下标运算符必须是成员函数.下表访问运算符通常要有一个const版本和一个非const版本.如果不定义const版本,那么c ...

  3. C++之操作符重载探究(四):下标运算符重载

    前文:C++之操作符重载探究(三):输出操作符重载 下标运算符[ ]重载   如果一个类的成员是一个数组,我们可以使用下标操作符来访问数组的成员.例如一个类定义如下:   上述代码存在两个问题:(1) ...

  4. c 语言中下标运算符,详解C++中二进制求补运算符与下标运算符的用法

    二进制求补运算符:~ 语法 ~ cast-expression 备注 二进制反码运算符 (~)(有时称为"按位反码"运算符)将生成其操作数的按位二进制反码.即,操作数中为 1 的每 ...

  5. 重载运算与类型转换——基本概念,输入和输出运算符,算术和关系运算符,赋值运算符,下标运算符,递增和递减运算符,成员访问运算符...

    一.基本概念 重载的运算符时具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.和其他函数一样,重载的运算符也包含返回类型.参数列表以及函数体. 重载运算符函数的参数 ...

  6. 走进C++程序世界------操作符运算、操作符重载、转换运算符、双目元算、+=,-+运算符,比较运算符及下标运算符

    重载,在一个类定义中,可以编写几个同名的方法,但是只要它们的签名参数列表不同,Java就会将它们看做唯一的方法.简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法 下面关 ...

  7. C++ Primer 5th笔记(chap 14 重载运算和类型转换)下标运算符[]

    1. 设计准则 必须定义为成员函数. 通常返回访问元素的引用,从而使得下标可以出现在赋值运算符的任意一侧 2. 一般会定义两个版本: 返回普通引用. 类的常量成员,并返回常量引用以确保不会给返回的对象 ...

  8. 第十八章 33用重载输出运算符函数实现字符串的输出

    // 33用重载输出运算符函数实现字符串的输出 /*#include <iostream> using namespace std; class String { public:Strin ...

  9. C++允许重载的运算符和不允许重载的运算符

    C++中绝大部分的运算符允许重载,具体规定见表10.1. 表10.1 C++允许重载的运算符 双目算术运算符 + (加),-(减),*(乘),/(除),% (取模) 关系运算符 ==(等于),!= ( ...

最新文章

  1. YII2 百度富文本mini版UMEditor的使用
  2. NOIP模拟测试6「那一天我们许下约定(背包dp)·那一天她离我而去」
  3. 智睿学校网上评课系统 v8.8.4源码
  4. 一个简单的Ajax实例
  5. 为什么Docker,Vagrant和Ansible等工具比以往更热门
  6. DevComponents.AdvTree 相关笔记
  7. Glide图片框架使用详细介绍(一),kotlin从入门到进阶实战电子书
  8. Android 面试题集 答案,助你拿到心仪 Offer
  9. 安卓初始画面去黑色背景
  10. windows合成pfx
  11. python裁剪不规则区域_Python实现不规则图形填充的思路
  12. 【挖矿程式】oCam 萤幕录影软体竟然藏有挖矿程式 (BRTSvc)(转)
  13. 下载国外软件慢(例如:Python安装包)
  14. 自动化测试到底该怎么学?
  15. db2嵌套查询效率_嵌套查询与连接查询的性能
  16. 基于CentOS7.6系统搭建远程GIT服务器
  17. Detailed OCI error val is 12154 and errmsg is ‘ORA-12154: TNS:could not resolve the connect identifi
  18. 单个c类网最多可以管理多少台计算机,在一个C类网络中,最多可以容纳( )台主机。...
  19. 性能测试从0到1的过程(二)
  20. Linux神器tmux

热门文章

  1. 电脑功耗软件_台式电脑配置详解!
  2. 织梦 php 传值,php获取post参数的几种方式
  3. win10系统预览体验计划错误代码0x800bfa19怎么办
  4. win7电脑浏览器证书过期的解决方法
  5. 电脑开机显示checking media解决方法
  6. maven项目调试debug错误Source not found.
  7. 解决mediawiki上传文件文件名是中文上传失败
  8. gta5显示nat较为严格_一年内上涨近3000元/㎡!碧桂园翡翠华府物业管理严格到令人惊叹...
  9. java 实现websocket的两种方式
  10. springboot-项目获取resources下文件的方法