我正在读一本书(Eric Lengyel 的游戏引擎开发基础),这本书正在用 C++ 编写一些 vector 操作,这里是片段:
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
数组。
如果您使用:
float* ptr = &x;
ptr
指向此类数组的第一个元素。
ptr[0]
计算数组的第一个元素,与 x
相同。
ptr[1]
计算为数组的第二个元素,与 y
相同。
ptr[2]
的计算结果为数组的第三个元素,与 z
相同。
这就是为什么
return((&x)[i]);
大部分时间都能正常工作,即使根据标准,此类代码会导致未定义的行为。
关于c++ - 这个 operator[] 函数的实现是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48031228/