如果C 中的支架重载运算符被声明为const函数

Should the bracket overloaded operator in C++ be declared as a const function?

本文关键字:声明 const 函数 运算符 重载 如果      更新时间:2023-10-16

我想在C 中为我的自定义数组类实现一个括号[]运算符。我有几个选择:

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

(3(我知道,如果用户声明const对象,则需要。但是,对于一般情况(1,2(,我应该制作函数const,因为该对象在功能主体中从未修改?

(1(是正确返回参考的正确的。

(2(需要是非const,因为您希望能够通过返回的参考来修改类成员

(3(需要const,因此可以在const this或同等参考中调用[]

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

您应该与const Overload一起提供非const版本:

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