不太明白 & 运算符的地址在这个结构中做什么,以及它如何能够访问其他成员变量



我开始掌握 c++,我想我会学习如何创建向量并对其进行操作,这样做我会掌握指针和引用。 也许我已经看了太久了,但我不太确定与我正在关注的书中的 return 语句相关的代码部分发生了什么,更具体地说是return ((&x)[i]);部分。 列出如下:

float& operator [](int i)
{
return ((&x)[i]);
}

我的理解是,&- 地址运算符会给你一个特定变量的地址。现在,如果我没记错的话,指针和数组是齐头并进的,所以当你得到对x变量的引用时,你可以使用偏移运算符访问下一个元素(&x)[i]但我不知道你可以用结构体做到这一点。

我走在正确的轨道上还是失去了它?

使用以下链接来帮助我: http://www.cplusplus.com/doc/tutorial/pointers/https://en.cppreference.com/w/cpp/language/operator_member_access

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]);
}
const float& operator [](int i) const
{
return ((&x)[i]);
}
};
int main(int argc, char const *argv[])
{
Vector3D vec = Vector3D(1,2,3);
auto test = vec[1];
std::cout << test << std::endl;
return 0;
}

我知道这里打印的值将是 2,但我不太了解能够访问结构成员值的&x引用?

什么

return ((&x)[i]);

do 取x的地址,然后使用[i]得到与xi偏移量处的对象。 基本上,你假装你有一个int数组,而不是3个单独的intx是数组的第一个元素。

不过,出于几个原因,这是未定义的行为。 首先,您不能访问数组越界的元素。 一个对象可以被认为是一个数组,所以(&variable)[0]是合法的,因为它只是variable(忽略&可能被重载)。 因此,除了0之外的任何索引都是UB。 其次,允许编译器在类的成员变量之间放置填充。 这意味着,如果不断言类是预期的大小,您将无法知道yz与内存中的x相邻。

编写函数的正确方法是使用开关语句,例如

float& operator [](int i)
{
switch(i)
{
case 0: return x;
case 1: return y;
case 2: return z;
default: // throw an exception or return one of the members or do something else to indicate an error
}
}

相关内容

最新更新