如何重载 [] 运算符以支持其他函数中的赋值和 const 参数?
How to overload the [] operator to support both assignment and const parameters in other functions?
考虑 class SomeClass
:
class SomeClass{
public:
// Constructors, other members
float& operator[](const unsigned i);
friend bool operator==(const SomeClass &A, const SomeClass &B);
};
假设这是 ==
运算符为此 class 重载的方式(不是实际实现,而是过于简化的版本):
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&
return 值。实现 read/write operator []
的一般模式是
T& operator [](index_type i);
T const& operator [](index_type i) const;
考虑 class SomeClass
:
class SomeClass{
public:
// Constructors, other members
float& operator[](const unsigned i);
friend bool operator==(const SomeClass &A, const SomeClass &B);
};
假设这是 ==
运算符为此 class 重载的方式(不是实际实现,而是过于简化的版本):
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&
return 值。实现 read/write operator []
的一般模式是
T& operator [](index_type i);
T const& operator [](index_type i) const;