下標運算子的過載有兩種形式:
形式1:int& operator (int index);// 從外部可更改陣列元素
形式2:const int& operator (int index) const;// 僅供元素的讀寫使用
對於形式1來說,其返回值是非const的,所以可以從外部通過下標操作符來更改陣列的值,即如下語句是合法的:
array arr(10
);//定義乙個非const物件
arr[5]
=7;//更改有效;相當於arr.operator(5)=7,呼叫形式1,因為返回值是非const的,故可以作為左值
int var = arr[3]
;//訪問
對於形式2來說,有兩點需要注意:
1)返回值是const的,所以從外部只能通過訪問陣列元素,但不能從外部通過來修改陣列的值:
const array brr(6
);brr[5]
=7;//非法;相當於brr.operator(5)=7,呼叫形式2,因為此時返回值是非const的,故可以作為左值
int var = brr[3]
;//訪問
2)const物件只能呼叫const成員函式。
這就是明明arr[3]和 brr[3]看起來一樣但實質呼叫的過載函式不一樣,所以返回值型別也不一樣,從而操作結果不一樣的原因!!!
擴:非const物件可以呼叫非const成員函式,也可以呼叫const成員函式。(所以為什麼arr沒有呼叫形式2呢?我也不知道)
換言之:
非const成員函式只能處理非const物件; const成員函式可以處理const物件,也可以處理非const物件。
定義形式1、形式2兩種過載函式的好處是,這樣可以定義元素寫入,讀取使用不同的方式。編譯器將在讀取類物件時呼叫const函式,而在對類物件執行寫入操作時呼叫非const函式。因此,如果願意,可在兩個下標函式中實現不同的功能。
c 運算子過載 常用運算子 知識點
先給出一段 具體函式內容會在下面給出 class person bool operator person p 過載 bool operator person p 過載 person operator 前置 過載 person operator int 後置 過載 friend ostream ope...
C 關於運算子過載知識點
1 除了類屬關係運算子 成員指標運算子 作用域運算子 sizeof運算子和三目運算子 以外,c 中的所有運算子都可以過載。2 過載運算子限制在c 語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。3 運算子過載實質上是函式過載,因此編譯程式對運算子過載的選擇,遵循函式過載的選擇原則...
C 下標運算子 過載
下標操作符 通常用於訪問陣列元素。過載該運算子用於增強操作 c 陣列的功能。下面的例項演示了如何過載下標運算子 include using namespace std const int size 10 class safearay int operator int i if i size cout...