c++重载下标运算符的两个版本

标签 c++ operator-overloading subscript

我的问题是关于以下两者之间的区别:

const T& operator[](const int nIndex) const;

和:

T& operator[](const int nIndex);

为什么我需要将它们都定义在一个类中,目的是什么?后者还不够吗?

最佳答案

在其末尾带有 const 的成员函数声明允许甚至在 const 对象上调用该函数。这仅对不修改对象状态的成员函数有意义。

假设您拥有的重载这些运算符的类称为 X。据推测,它的行为有点像容器,可以通过此 operator[] 访问它包含的元素。

现在假设用户想要使用 const X:

const X x = /* fill it */;
use(x[0]);

是否应该允许用户这样做?大概。如果他们想要一个不可变的容器,那就让他们拥有吧。如果您没有提供 operator[]const 版本,他们将无法执行此操作。毕竟他们并没有试图修改容器,他们只是在查看其内容。

现在为什么要让 operator[]const 版本返回一个 const 引用?因为它必须。它返回对类本身成员的引用。如果容器是 const 并返回一个非 const 引用,则调用者只需使用此运算符就可以修改其内部结构:

const X x = /* fill it */;
x[0].modify();

哦,亲爱的,我们修改了 x 的状态,即使它是 const。这会很糟糕,事实上,编译器甚至不允许您这样做。

关于c++重载下标运算符的两个版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15413831/

相关文章:

c++ - opengl 纹理立方体 C++

c++ - 分段故障二叉树

F# 和运算符重载 : (>) and (^)

r - 如何将表达式传递给 ggplot 中的 geom_text 标签?

ios - 下标:使用 String 枚举访问我的字典值

python - 为字符串中的所有数字添加下标格式

c++ - 模板类/结构组合的好方法

ios - 如何在swift中重载赋值运算符

java - 运算符 << 重载 - C++ 与 Java

c++ - 在 Linux for Windows 上构建应用程序