如何重载[]运算符以支持其他函数中的赋值和常量参数



考虑一个类SomeClass:

class SomeClass{
public:
// Constructors, other members
float& operator[](const unsigned i);
friend bool operator==(const SomeClass &A, const SomeClass &B);
};

假设==运算符就是这样为这个类重载的(不是实际的实现,而是一个过于简化的版本(:

bool operator==(const SomeClass &A, const SomeClass &B){
if (A[0] == B[0])
return true;
return false;
}

这将引发编译器错误,因为重载的[]运算符要求实例为非const。然而,如果我更改[]运算符的定义以允许const实例,我就不能再进行赋值:

// ASSUMING: const float& operator[](const unsigned i) const;
SomeClass a;
a[0] = 0; // error, because the return value of [] is a reference to const!

我真的不想在==运算符的参数中去掉const,因为操作数在函数中不会改变。处理这个问题的正确方法是什么?

过载operator []以提供两者:

float& operator [](unsigned int i);
float operator [](unsigned int i) const;

对于复制成本不低的通用T,请使用T const&返回值。实现读/写operator []的一般模式是

T& operator [](index_type i);
T const& operator [](index_type i) const;

相关内容

最新更新