看一看多個操作符[]重載
class Array {
const unsigned int _size;
int _array[100];
public:
Array() : _size(100) {
for(unsigned int i = 0; i < _size; i++)
_array[i] = 0;
}
int& operator[](unsigned int index) {
cout << "normal operator[].\n";
return _array[index];
}
const int& operator[](unsigned int index) const {
cout << "const operator[].\n";
return _array[index];
}
};
int main()
{
Array a;
a[3] = 1;
cout << a[3] << "\n";
system("pause");
return 0;
}
「正常操作符[]」行被執行兩次這個簡單的數組類,雖然我期望第二呼叫(cout << a[3] << "\n";
)使用const是重載操作符的版本,因爲它不會更改數組本身。
這是爲什麼?有沒有辦法強制const的版本被調用,因爲我希望?
'a'在該表達式中不是'const',所以不會調用const超載。如果你想強制它,你可以使用'const_cast(a)[3]'但它確實沒有必要。 –
user657267
那有什麼意義?我試圖模仿std :: vector,因爲它也有兩個重載的operator []函數。你是說,除非std :: vector對象是const(因爲我沒有看到這一點),非const版本將永遠被調用? – Pilpel
'除非std :: vector對象是const,否則總是會調用非const的版本'這是(有點)const const超載的定義,是的。請注意,底層對象本身可能是非const的,並且通過const引用來訪問,通常情況下是這樣。在你的代碼中,你可以使用'Array const&b = a; cout << b [3];' – user657267