将支架运算符作为成员函数

Overloading bracket operator as member function

本文关键字:成员 函数 运算符      更新时间:2023-10-16

我正在为vector3d类型对象做一个简单的类。以下代码将编译并完美运行。

class Vector3D {
    float x, y, z;
public:
    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 ** argv){
    Vector3D myVec(1,2,3);
    printf("Value of y: %dn", myVec[1]);
}

但是,当我删除操作员地址(&)时,我会遇到错误,并且代码将不起作用。为什么需要(&)?即:

return (x)[i]; // will not compile "expression must have pointer-to-object type"
return (&x)[i]; // all good here

我也很难理解这是如何工作的。该函数如何返回iTh float,成员变量是否以连续的方式存储在内存(如数组)中?

您这样做的方式非常棘手,这是未定义的行为

不能保证结构成员布局,但是大多数时候将成员放在内存上为:

x---y---z--- (4 bytes each)
x[0]
    x[1]
        x[2]

所以这就是为什么您的代码工作(请记住这是不是定义的行为)。

您的代码无论如何都不会进行界限,因此请考虑:

  1. 将其转换为开关。
  2. 使您的成员像float x[3]这样的数组。