zoukankan      html  css  js  c++  java
  • 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 对象,所以在编程时通常会提供两个版本的运算符重载函数。
  • 相关阅读:
    时尚意
    ​runtime 运行时机制
    ios-UIAlertView,UIActionSheet-常用方法
    ios-UIActivityIndicatorView-常用方法
    ios-UIPageControl-常用方法
    ios-UISegmentedControl-常用方法
    ios-UISlider-常用方法和定时器NSTimer的使用
    ios-UITextField-常用方法
    java捕获特定异常特定处理
    ios-UIButton-常用方法
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/5827667.html
Copyright © 2011-2022 走看看