operator []函数的这个实现如何工作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了operator []函数的这个实现如何工作?相关的知识,希望对你有一定的参考价值。
我正在阅读一本书(Eric Lengyel的游戏引擎开发基础),本书正在用c ++写出一些向量操作,这里是片段:
struct Vector3D
{
float x, y, z;
Vector3D() = default;
Vector3D(float a, float b, float c)
{
x = a;
y = b;
z = c;
}
float& operator [](int i)
{
return((&x)[i]);
}
};
我特别关注这件作品:
float& operator [](int i)
{
return((&x)[i]);
}
现在我希望这个代码返回x,无论输入什么索引。但是,根据输入输出相应的变量(x,y或z)。为什么是这样?谢谢您的帮助。
答案
暂时,让我们忽略功能实现方式的臭味。
问题是,它是如何运作的?
如果查看类对象的成员变量,当成员之间没有填充时,它们将在内存中布局为:
+-----+-----+-----+
| x | y | z |
+-----+-----+-----+
使用这样的布局,对象看起来好像是float
s的数组。
如果您使用:
float* ptr = &x;
ptr
指向这样一个数组的第一个元素。
ptr[0]
计算数组的第一个元素,与x
相同。
ptr[1]
计算数组的第二个元素,与y
相同。
ptr[2]
计算数组的第三个元素,与z
相同。
这就是为什么
return((&x)[i]);
大部分时间都可以工作,即使这样的代码是导致每个标准的未定义行为的原因。
以上是关于operator []函数的这个实现如何工作?的主要内容,如果未能解决你的问题,请参考以下文章