• C++学习29 重载[](下标运算符)


    前面已经提到,下标操作符[]必须以类的成员函数的形式进行重载。在类中的声明格式如下:

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

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

    使用第一种声明方式,操作符重载函数不仅可以访问对象,同时还可以修改对象。使用第二种声明方式,操作符重载函数只能访问而不能修改对象。

    默认情况下,通过下标访问数组中的元素并不具有检查边界溢出功能,我们可以通过重载实现该功能。

    请看下面的代码:

    #include<iostream>
    #include<string>
    using namespace std;
    class Array{
    private:
        int length;
        int * num;
    public:
        Array(): length(0), num(NULL){ }
        Array(int n);
        int & operator[](int);
        const int & operator[]( int )const;
        int getlength() const{ return length; }
    };
    Array::Array(int n){
        num = new int[n];
        length = n;
    }
    int& Array::operator[](int i){
        if(i < 0 || i >= length)
            throw string("out of bounds");
        return num[i];
    }
    const int & Array::operator[](int i) const{
        if(i < 0 || i >= length)
            throw string("out of bounds");
        return num[i];
    }
    int main(){
        Array A(5);
        int i;
        try{
            for(i = 0; i < A.getlength(); i++)
                A[i] = i;
            for(i = 0 ;i < 6; i++ )
                cout<< A[i] <<endl;
        }catch(string s){
            cerr<< s <<", i = "<< i <<endl;
        }
      
        return 0;
    }

     本例提供了两个版本的下标运算符重载函数:

    int & operator[]( int );
    const int & operator[]( int )const;

    第一个函数最后不带 const,加上 const 意味着该成员函数是常成员函数,如果第一个函数后面也加上了const,则两个函数仅有返回值不同,编译器不能够区分这是函数重载,会报错。这两个版本的重载函数其实很好理解,第一个能够修改对象,第二个只能访问对象而不能修改对象。

    重载下标运算符[]后,“arr[5]”会被转换为:

    arr.operator[]( 5 );

    最后需要说明的是:即使没有定义 const 版本的重载函数,这段代码也是可以正确运行的,但是非 const 成员函数不能处理 const 对象,所以在编程时通常会提供两个版本的运算符重载函数。
  • 相关阅读:
    便利的开发文档工具doxygen
    父页面 js 取得弹出窗口所选择的值, 弹出窗口关闭后刷新父页面
    ASCII码对照表
    C#中Brush、Color、String相互转换
    C#获取标准北京时间
    2005数据库脚本在SQL2000上执行 注意事项
    给Image控件后台赋Source值
    Web服务枚举组件不可用
    泛型集合转化为DataSet
    网站常见关于"登录|注册"和"姓名|注销"用JS实现
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/5827667.html
Copyright © 2020-2023  润新知