Doom 3 source:为什么表示2向量的类会重载下标运算符两次?

时间:2012-01-14 00:50:28

标签: c++ operator-overloading const

我以为我会通过查看最近发布的Doom 3源代码来尝试加强我的C ++和OpenGL。到目前为止学到的很多,但我已经碰壁了。详细课程here有方法

float  operator[] (int index) const  

float &  operator[] (int index) 

其身体都读取

return ( &x )[ index ];

其中x是类'两个数据成员之一(另一个是y;此类用于2向量)。

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

const似乎只是为了区分标题以允许编译而出现(或不显示为首选)。 (也就是说,删除const并且VS2010拒绝编译,类似地,如果两个标题都以const结尾。)

为什么将ref引回浮动?这个类中没有其他七种浮点型方法可以做到这一点,所以我猜测效率不是一个因素(可能这个运算符比其他运算符更频繁地被称为)。

欣赏有关此处发生的事情的任何见解......

4 个答案:

答案 0 :(得分:7)

这是一个常见的习语(称为“const重载”)。请参阅C ++ FAQ:http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.12

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

注意,至关重要的是,这是区分读写访问的方法。

答案 1 :(得分:1)

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

theObject[anIndex] = 1.0;

这要求theObject可以作为非const对象(或通过Object *Object &)使用。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

  

为什么要将ref返回浮动?

返回对float的引用的原因是允许调用者修改该float。 (顺便说一下,效率不会成为这个原因,因为指针往往至少与浮点数一样大,所以额外的间接是纯粹的成本。)

方法签名末尾的

const表示可以在const对象/引用/表达式上安全地调用它。因此,如果vidVec2,那么v[0]可以用作左值(而v[0] = 3.0f实际上会设置v[0]),但如果{{1} }}是v,然后const idVec2只能用作右值(意味着v[0]是非法的)。