程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++基礎知識 >> C++重載[](下標運算符)

C++重載[](下標運算符)

編輯:C++基礎知識
前面已經提到,下標運算符[]必須以類的成員函數的形式進行重載。該函數在類中的聲明格式如下:

返回值類型 & operator[] (參數)

或者:

const 返回值類型 & operator[] (參數)

使用第一種聲明方式,運算符重載函數不僅可以訪問對象,同時還可以修改對象。使用第二種聲明方式,運算符重載函數只能訪問而不能修改對象。

默認情況下,通過下標訪問數組中的元素並不具有檢查邊界溢出功能,我們可以通過運算符重載實現該功能。

請看下面的代碼:
#include <iostream>
#include <string>
using namespace std;

class Array{
public:
    Array();
    Array(int n);
public:
    int & operator[](int);
    const int & operator[]( int ) const;
    int getlength() const{ return m_length; }
private:
    int m_length;  //數組長度
    int *m_pNums;  //指向數組內存的指針
};

Array::Array(): m_length(0), m_pNums(NULL){ }
Array::Array(int n): m_length(n){
    m_pNums = new int[n];
}

int& Array::operator[](int i){
    if(i < 0 || i >= m_length){
        throw string("out of bounds");
    }
    return m_pNums[i];
}

const int & Array::operator[](int i) const{
    if(i < 0 || i >= m_length){
        throw string("out of bounds");
    }
    return m_pNums[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;
}
運行結果:
0
1
2
3
4
out of bounds, i = 5
本例用到了C++的錯誤處理機制以及 string 類,後續將會講解。
本例提供了兩個版本的下標運算符重載函數:

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

第一個函數最後不帶 const,加上 const 意味著該成員函數是常成員函數,如果第一個函數後面也加上了const,則兩個函數僅有返回值不同,編譯器不能夠區分這是函數重載,會報錯。這兩個版本的重載函數其實很好理解,第一個能夠修改對象,第二個只能訪問對象而不能修改對象。

重載下標運算符[]後,arr[5]會被轉換為:

arr.operator[]( 5 );

最後需要說明的是:即使沒有定義 const 版本的重載函數,這段代碼也是可以正確運行的,但是非 const 成員函數不能處理 const 對象,所以在編程時通常會提供兩個版本的運算符重載函數。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved