毁灭战士 3 来源:为什么表示 2 向量的类会重载下标运算符两次

Doom 3 source: why does a class representing 2-vectors overload the subscript operator twice?

本文关键字:运算符 下标 重载 两次 来源 为什么 表示 向量 毁灭战士      更新时间:2023-10-16

我想我会尝试通过查看最近发布的Doom 3源代码来加强我的C++和OpenGL。到目前为止学到了很多东西,但我碰壁了。此处详述的类具有方法

float  operator[] (int index) const  

float &  operator[] (int index) 

谁的身体都读

return ( &x )[ index ];

其中x是类的两个数据成员之一(另一个是y;这个类是2向量(。

虽然我可以理解每个版本的标题/原型的语法,但我不明白为什么它们都存在。

const似乎出现(或不出现,根据需要(只是为了充分区分标头以允许编译。(也就是说,删除const,VS2010 拒绝编译,同样,如果两个标头都以 const 结尾。

为什么要将引用返回到浮点数?该类的其他七种浮点型方法都没有这样做,所以我猜效率不是一个因素(也许这个运算符比其他运算符更频繁地调用(。

感谢对这里发生的事情的任何见解......

这是一个

常见的成语(称为"const 重载"(。 请参阅C++常见问题解答:http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.12。

歧义是通过*this是否const来解决的。 在 const 对象上,调用const重载,在这种情况下,它以只读样式运行。 在非const对象上,调用非const,在这种情况下,它以读/写样式运行。

请注意,至关重要的是,这不是区分读取和写入访问的方法。

将它们

视为一对相关的下标元素的gettersetter方法。float & operator[](int index)setter 版本,允许您使用如下语法:

theObject[anIndex] = 1.0;

这要求theObject作为非const对象(或通过Object *Object &(提供

在没有 const 的情况下,您正在使用引用,因为您想在调用函数时更改值。例如,设置一个值:a[11] = 5.0;

添加了 const 的情况,因为如果其他函数调用的所有其他函数也是 const 函数,则只能将它们声明为 const 函数。

为什么要将引用返回到浮点数?

返回对浮点数的引用的原因是允许调用方修改该浮点数。(顺便说一下,效率不会成为造成这种情况的原因,因为指针往往至少和浮点数一样大,所以额外的间接寻址是纯粹的成本。

方法签名末尾的const表示可以在const对象/引用/表达式上安全地调用它。所以,如果v是一个idVec2,那么v[0]可以用作左值(v[0] = 3.0f实际上会设置v[0](,但如果v是一个const idVec2,那么v[0]只能用作右值(意味着v[0] = 3.0f是非法的(。