operator []函数的这个实现如何工作?

问题描述 投票:1回答:1

我正在阅读一本书(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)。为什么是这样?谢谢您的帮助。

c++ vector 3d game-engine
1个回答
3
投票

暂时,让我们忽略功能实现方式的臭味。

问题是,它是如何运作的?

如果查看类对象的成员变量,当成员之间没有填充时,它们将在内存中布局为:

+-----+-----+-----+
|  x  |  y  |  z  |
+-----+-----+-----+

使用这样的布局,对象看起来好像是floats的数组。

如果您使用:

float* ptr = &x;

ptr指向这样一个数组的第一个元素。

ptr[0]计算数组的第一个元素,与x相同。 ptr[1]计算数组的第二个元素,与y相同。 ptr[2]计算数组的第三个元素,与z相同。

这就是为什么

return((&x)[i]);

大部分时间都可以工作,即使这样的代码是导致每个标准的未定义行为的原因。

© www.soinside.com 2019 - 2024. All rights reserved.