应该将C ++中的括号重载运算符声明为const函数吗?

时间:2019-05-09 17:21:14

标签: c++ operator-overloading

我想为C ++中的自定义Array类实现方括号[]运算符。我有两种选择:

(1)Point& operator[](int index)
(2)Point& operator[](int index) const
(3)const Point& operator[](int index) const

(3)我知道在用户声明const对象的情况下是必需的。 但是,对于一般情况(1、2),我应该将函数设为const,因为该对象从未在函数主体中进行修改吗?

1 个答案:

答案 0 :(得分:4)

(1)对于返回引用是正确的。

(2)必须为非const,因为您希望能够通过返回的引用 修改类成员。

(3)必须为const,以便可以在[]或等效引用上调用const this

Point& operator[](int index) const会导致意外的行为,因为您可以通过引用来修改类成员。您的Point& operator[](int index)函数代码可能未在修改对象,但是由于它返回了对数据成员的非常量引用,因此它允许其他代码来修改对象。因此,Point& operator[](int index) const不是您可以提供的东西,并且编译器不应该接受提供对类数据成员的非常量访问的const函数。

您应该改为提供非const版本以及const重载:

Point& operator[](int index);
const Point& operator[](int index) const;