我开始掌握 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]
得到与x
i
偏移量处的对象。 基本上,你假装你有一个int
数组,而不是3个单独的int
,x
是数组的第一个元素。
不过,出于几个原因,这是未定义的行为。 首先,您不能访问数组越界的元素。 一个对象可以被认为是一个数组,所以(&variable)[0]
是合法的,因为它只是variable
(忽略&
可能被重载)。 因此,除了0
之外的任何索引都是UB。 其次,允许编译器在类的成员变量之间放置填充。 这意味着,如果不断言类是预期的大小,您将无法知道y
和z
与内存中的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
}
}