看看这个简单的数组类
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;
}
“normal operator []”行执行两次,但我希望第二次调用(cout << a[3] << "\n";
)使用重载运算符的const版本,因为它不会更改数组本身。
为什么?有没有办法强制按我的意愿调用const版本?
答案 0 :(得分:1)
当你有一个方法的重载const版本时,当对象是const时将调用const版本。例如:
#include <iostream>
using namespace std;
class MyClass
{
public:
void foo()
{
cout << "foo()" << endl;
}
void foo() const
{
cout << "foo() const" << endl;
}
};
int main()
{
MyClass a;
const MyClass b;
a.foo();
b.foo();
return 0;
}
将为对象foo()
调用正常a
,为对象b
调用const版本。
在您的情况下,您只需要避免尝试分配const版本。例如:
Array a;
const Array b;
a[3] = 1;
// b[3] = 1; // error
cout << a[3] << "\n";
cout << b[3] << "\n";
工作正常。但是,如果您尝试将作业分配给b
,则会出现编译错误。
答案 1 :(得分:0)
std::ostream &operator<<(int x)
不会将其参数设为const
(因为const在按值传递时不是很有用),因此可以调用非const operator[]
那么,什么时候会const operator[]
被召唤?
除了一些边缘情况之外,const vector
变量声明几乎总是无用的。主要原因const operator[]
很重要,而且您经常会看到它使用的主要原因是在参考参数上调用它。
int readStuff(const std::vector<int> &dontMutateMe) {
return dontMutateMe[42]; // const
}
Constant reference parameters are valuable,此代码在没有const operator[]
的情况下无效。