毁灭战士 3 来源:为什么表示 2 向量的类会重载下标运算符两次
Doom 3 source: why does a class representing 2-vectors overload the subscript operator twice?
我想我会尝试通过查看最近发布的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
,在这种情况下,它以读/写样式运行。
请注意,至关重要的是,这不是区分读取和写入访问的方法。
视为一对相关的下标元素的getter和setter方法。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
是非法的(。
- 一组值的零开销下标运算符
- 如何重载下标运算符 [] 以引用 2d STL 数组?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 在继承的模板类中使用下标 [] 运算符
- 运算符重载多个任务的下标和赋值运算符
- 为什么函数的任何索引处的下标运算符在C++中总是返回1
- c++下标运算符到下级类向量
- 数组下标运算符 ([ ]) 对数组有什么作用?
- 双标具有下标运算符的原因是什么?
- 下标是否在分配运算符的右侧进行评估
- 基成员的重载下标运算符
- SFINAE 为什么我没有检测到 std::vector 的下标运算符?
- 如何重载下标运算符以返回可以是左值的可选值?
- C++下标运算符的继承规则
- 使用带有下标运算符的赋值运算符将值分配给 std::map
- 如何从重载的下标 [] 运算符返回 std::unique_ptr&?
- 为下标运算符和函数调用运算符提供默认参数
- C++ 下标运算符
- 运算符() 作为矩阵类的下标
- 将类实例作为指针传递,并在此指针上使用过载的下标运算符