C++重载下标运算符
生活随笔
收集整理的這篇文章主要介紹了
C++重载下标运算符
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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++重载下标运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 删除用户权限
- 下一篇: C++ friend关键字