C++下標(biāo)運(yùn)算符詳解
C++ 規(guī)定,下標(biāo)運(yùn)算符[ ]
必須以成員函數(shù)的形式進(jìn)行重載。該重載函數(shù)在類中的聲明格式如下:
返回值類型 & operator[ ] (參數(shù));
const 返回值類型 & operator[ ] (參數(shù)) const;
使用第一種聲明方式,[ ]
不僅可以訪問(wèn)元素,還可以修改元素。使用第二種聲明方式,[ ]
只能訪問(wèn)而不能修改元素。在實(shí)際開(kāi)發(fā)中,我們應(yīng)該同時(shí)提供以上兩種形式,這樣做是為了適應(yīng) const 對(duì)象,因?yàn)橥ㄟ^(guò) const 對(duì)象只能調(diào)用 const 成員函數(shù),如果不提供第二種形式,那么將無(wú)法訪問(wèn) const 對(duì)象的任何元素。下面我們通過(guò)一個(gè)具體的例子來(lái)演示如何重載[ ]
。我們知道,有些較老的編譯器不支持變長(zhǎng)數(shù)組,例如 VC6.0、VS2010 等,這有時(shí)候會(huì)給編程帶來(lái)不便,下面我們通過(guò)自定義的 Array 類來(lái)實(shí)現(xiàn)變長(zhǎng)數(shù)組。
#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; //數(shù)組長(zhǎng)度 int *m_p; //指向數(shù)組內(nèi)存的指針 }; 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; //訪問(wèn)最后一個(gè)元素 return 0; }
運(yùn)行結(jié)果:
5↙
0, 5, 10, 15, 20
33685536
重載[ ]
運(yùn)算符以后,表達(dá)式arr[i]
會(huì)被轉(zhuǎn)換為:
需要說(shuō)明的是,B 是 const 對(duì)象,如果 Array 類沒(méi)有提供 const 版本的operator[ ]
,那么第 60 行代碼將報(bào)錯(cuò)。雖然第 60 行代碼只是讀取對(duì)象的數(shù)據(jù),并沒(méi)有試圖修改對(duì)象,但是它調(diào)用了非 const 版本的operator[ ]
,編譯器不管實(shí)際上有沒(méi)有修改對(duì)象,只要是調(diào)用了非 const 的成員函數(shù),編譯器就認(rèn)為會(huì)修改對(duì)象(至少有這種風(fēng)險(xiǎn))。
到此這篇關(guān)于C++下標(biāo)運(yùn)算符詳解的文章就介紹到這了,更多相關(guān)C++下標(biāo)運(yùn)算符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++11 符號(hào)修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind
這篇文章主要介紹了c++11 符號(hào)修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05使用用C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼
大家好,本篇文章主要講的是使用用C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,歡迎借鑒學(xué)習(xí)C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼2021-12-12C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Linux頁(yè)面置換算法的C語(yǔ)言實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Linux頁(yè)面置換算法的C語(yǔ)言實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C++ GDI實(shí)現(xiàn)圖片格式轉(zhuǎn)換
GDI+(Graphics Device Interface Plus)是一種用于圖形繪制和圖像處理的應(yīng)用程序編程接口(API),在Windows平臺(tái)上廣泛使用,本文就來(lái)介紹一下如何使用GDI實(shí)現(xiàn)圖片格式轉(zhuǎn)換吧2023-12-12C語(yǔ)言實(shí)踐設(shè)計(jì)開(kāi)發(fā)飛機(jī)游戲
飛機(jī)大戰(zhàn)想必是很多人童年時(shí)期的經(jīng)典游戲,我們依舊能記得抱個(gè)老人機(jī)娛樂(lè)的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于如何利用C語(yǔ)言寫一個(gè)簡(jiǎn)單的飛機(jī)大戰(zhàn)小游戲的相關(guān)資料,需要的朋友可以參考下2022-02-02Qt基于TCP實(shí)現(xiàn)客戶端與服務(wù)端的連接
這篇文章主要為大家詳細(xì)介紹了Qt基于TCP實(shí)現(xiàn)客戶端與服務(wù)端的連接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08c++中的字節(jié)序與符號(hào)位的問(wèn)題
這篇文章主要介紹了c++中的字節(jié)序與符號(hào)位的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07關(guān)于C++中的友元函數(shù)的一些總結(jié)
以下是對(duì)C++中的友元函數(shù)進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09