2013-06-05 64 views
0

我得到了一個賦值來實現模板數組類。 其中一個要求是重載[]運算符。 我做了這兩個常量和非const版本似乎工作正常。數組運算符[]重載const和非const版本

const T& operator[](const unsigned int index)const 

T& operator[](const unsigned int index) 

我的問題是如何將編譯器知道跑 哪一個的時候我會做這樣的事情:

int i=arr[1] 

在非const的陣列?

+0

它會調用'const'對象的'const'版本,否則非'const'版本。 –

+0

我不太明白你的意思,你可以詳細說明一下嗎? – petric

+0

如果'arr'是const,則會調用const版本。 –

回答

6

非const函數將始終在非常量數組上調用,const函數在常量數組上調用。

如果有兩個名稱相同的方法,編譯器會根據參數的類型和隱式對象參數(arr)的類型選擇最合適的方法。

我剛纔已經回答了類似的問題有一天,你會發現它有用:https://stackoverflow.com/a/16922652/2387403

+0

非常感謝你的幫助。 – petric

1

這一切都取決於你的對象的聲明。如果你有

const T arr[]; 
... 
int i=arr[1]; 

然後const版本將被調用,但是如果你有

T arr[]; 
... 
int i=arr[1]; 

則非const版本將被調用。所以在你給出的例子中,因爲它是一個非const數組,所以非const版本將被調用。

+0

你的意思是說編譯器只會更喜歡在const函數上調用non-const版本嗎? 如果可以,請解釋原因? – petric

+0

@petric是的,它會的。至於爲什麼,想象一下,如果每次調用函數時會發生什麼,它會默認爲const版本。做任何事情都是不可能的,而且這個函數的非const版本沒有意義,因爲它永遠不會被調用。 –

+0

是的,我知道了,謝謝。 – petric

相關問題