c++ - 变量地址的运算符[]如何工作?

标签 c++ overloading operator-keyword

例如:

int x = 5;
std::cout<<(&x)[0]<<std::endl; -> prints 5

我在一本书中找到了 3DVector 的表示:

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]);
}
};

如果将其用作:

    Vector3D myVec(0,2,3);
    std::cout<<myVec[0]<<std::endl;
    std::cout<<myVec[1]<<std::endl;
    std::cout<<myVec[2]<<std::endl;

它将打印 x, y, z 的值

它是如何工作的?这安全吗?

最佳答案

当你执行 &x 时,你会得到一个指向 x 的指针。当您执行 pointer[N] 时,编译器所做的是将其转换为 *(pointer + N)。在您的代码中,因为 N0 我们剩下 *(&x) 这只是取消引用我们刚刚创建的指针并返回变量本身.


您发现它的代码实际上是未定义的行为。当他们这样做时

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

他们假设类中没有填充,并将 3 个独立的成员视为一个数组。但是,无法做出这种假设,并且访问被明确称为标准中的未定义行为。

关于c++ - 变量地址的运算符[]如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920024/

相关文章:

C++ 在 int 变量中存储 double 错误

c++ - C++中的模板类

c++ - const最佳匹配函数与其他函数之间的歧义

c++ - 为字符串类 C++ 重载 >> 运算符

c++ - 如何在 C++ 中正确返回运算符 (*,/,-,+)?

c++ - 在 C++ 中向多态树添加功能

C++ while循环和getline问题

c++ - sstream 不填充 vector C++

java - 重载方法分派(dispatch),无访问者模式

c++ - 实现多个函数调用是不好的做法吗?