gpt4 book ai didi

c++ - 多个 operator[] 重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:15 25 4
gpt4 key购买 nike

看看这个简单的数组类

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 版本?

最佳答案

当你有一个方法的重载 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;
}

将为对象 a 调用普通的 foo(),为对象 b 调用常量版本。

在你的情况下,你只需要避免尝试分配给 const 版本。例如:

Array a;
const Array b;

a[3] = 1;
// b[3] = 1; // error
cout << a[3] << "\n";
cout << b[3] << "\n";

工作正常。但是,如果您尝试对 b 进行赋值,则会出现编译错误。

关于c++ - 多个 operator[] 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33248813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com