我以为我会通过查看最近发布的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引回浮动?这个类中没有其他七种浮点型方法可以做到这一点,所以我猜测效率不是一个因素(可能这个运算符比其他运算符更频繁地被称为)。
欣赏有关此处发生的事情的任何见解......
答案 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
对象/引用/表达式上安全地调用它。因此,如果v
是idVec2
,那么v[0]
可以用作左值(而v[0] = 3.0f
实际上会设置v[0]
),但如果{{1} }}是v
,然后const idVec2
只能用作右值(意味着v[0]
是非法的)。