我偶然发现了这个类(class):
class Vec3f
{
...
float x, y, z;
...
};
inline float operator[](const int index) const
{
return (&x)[index];
}
inline float& operator[](const int index)
{
return (&x)[index];
}
该类使用 [] 来访问数组中的 x、y、z 值,以便 v[0]是x中的值,v[1]是y中的值,v[2]是z中的值,但是
- 返回声明如何运作?
- 这样理解是否正确:“获取从x的地址开始的索引指定的地址中的值”?
- Do (&x) 必须在括号中,否则会返回 x[index] 的地址值,不是吗?
最佳答案
从技术上讲,这不是有效的代码。
但是发生了什么:
// Declare four variables
// That are presumably placed in memory one after the other.
float x, y, z;
在代码中:
return (&x)[index];
// Here we take the address of x (thus we have a pointer to float).
// The operator [] when applied to fundamental types is equivalent to
// *(pointer + index)
// So the above code is
return *(&x + index);
// This takes the address of x. Moves index floating point numbers further
// into the address space (which is illegal).
// Then returns a `lvalue referring to the object at that location`
// If this aligns with x/y/z (it is possible but not guaranteed by the standard)
// we have an `lvalue` referring to one of these objects.
很容易实现这项工作并且合法:
class Vec3f
{
float data[3];
float& x;
float& y;
float& z;
public:
float& operator[](const int index) {return data[index];}
Vec3f()
: x(data[0])
, y(data[1])
, z(data[2])
{}
Vec3f(Vec3f const& copy)
: x(data[0])
, y(data[1])
, z(data[2])
{
x = copy.x;
y = copy.y;
z = copy.z;
}
Vec3f& operator=(Vec3f const& rhs)
{
x = rhs.x;
y = rhs.y;
z = rhs.z;
return *this;
}
};
关于c++ - 在这种情况下,运算符 [ ] 重载如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18310301/