C++下标运算符详解

 更新时间:2023年09月15日 09:40:55   作者:向阳逐梦  
C语言中的下标运算符用于访问数组或指针变量中的元素,它使用方括号 [] 来表示,并在方括号内指定元素的索引位置,本文给大家详细的讲解一下C++的下标运算符,需要的朋友可以参考下

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

返回值类型 & 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 ;

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

到此这篇关于C++下标运算符详解的文章就介绍到这了,更多相关C++下标运算符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    这篇文章主要介绍了c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 使用用C++做一颗会跳动的爱心实例代码

    使用用C++做一颗会跳动的爱心实例代码

    大家好,本篇文章主要讲的是使用用C++做一颗会跳动的爱心实例代码,感兴趣的同学赶快来看一看吧,欢迎借鉴学习C++做一颗会跳动的爱心实例代码
    2021-12-12
  • C语言算法练习之佩奇存钱方案

    C语言算法练习之佩奇存钱方案

    这篇文章主要该大家分享C语言算法佩奇存钱的练习,文章主要通过描述佩奇存钱的问题然后确定程序框架将结果运算出来,下面来看详细内容吧,需要的朋友可以参考一下
    2022-04-04
  • C语言实现简单的井字棋游戏

    C语言实现简单的井字棋游戏

    这篇文章主要为大家详细介绍了C语言实现简单的井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Linux页面置换算法的C语言实现

    Linux页面置换算法的C语言实现

    这篇文章主要为大家详细介绍了Linux页面置换算法的C语言实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++ GDI实现图片格式转换

    C++ GDI实现图片格式转换

    GDI+(Graphics Device Interface Plus)是一种用于图形绘制和图像处理的应用程序编程接口(API),在Windows平台上广泛使用,本文就来介绍一下如何使用GDI实现图片格式转换吧
    2023-12-12
  • C语言实践设计开发飞机游戏

    C语言实践设计开发飞机游戏

    飞机大战想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,下面这篇文章主要给大家介绍了关于如何利用C语言写一个简单的飞机大战小游戏的相关资料,需要的朋友可以参考下
    2022-02-02
  • Qt基于TCP实现客户端与服务端的连接

    Qt基于TCP实现客户端与服务端的连接

    这篇文章主要为大家详细介绍了Qt基于TCP实现客户端与服务端的连接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • c++中的字节序与符号位的问题

    c++中的字节序与符号位的问题

    这篇文章主要介绍了c++中的字节序与符号位的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 关于C++中的友元函数的一些总结

    关于C++中的友元函数的一些总结

    以下是对C++中的友元函数进行了详细的总结介绍,需要的朋友可以过来参考下
    2013-09-09

最新评论