Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变量地址的运算符[]如何工作?_C++_Overloading_Operator Keyword - Fatal编程技术网

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

C++ 变量地址的运算符[]如何工作?,c++,overloading,operator-keyword,C++,Overloading,Operator Keyword,例如: int x = 5; std::cout<<(&x)[0]<<std::endl; -> prints 5 如果将其用作: Vector3D myVec(0,2,3); std::cout<<myVec[0]<<std::endl; std::cout<<myVec[1]<<std::endl; std::cout<<myVec[2]<<std:

例如:

int x = 5;
std::cout<<(&x)[0]<<std::endl; -> prints 5
如果将其用作:

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

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


您在中找到的代码实际上是未定义的行为。当他们这样做的时候

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

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

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


您在中找到的代码实际上是未定义的行为。当他们这样做的时候

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

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

为什么我必须确保声明的变量一个接一个地存在?或者这只在这种特殊情况下有效?要想拥有安全的东西,必须使用。还要注意“OffStand不能在标准C++中实现,需要编译器支持”,因为它依赖于成员的structure@ChrisMM“它们以这种方式存储在内存中”可能,但不一定。它不是“通常认为不安全的”。这只是一种未定义的行为,从定义上讲,它总是不安全的,从来没有用处或帮助。@ChrisMM我真的不明白。“而且你会看到问题……”是相当误导的。有可能不会出现任何问题为什么我必须确保声明的变量一个接一个地存在?或者这只在这种特殊情况下有效?要想拥有安全的东西,必须使用。还要注意“OffStand不能在标准C++中实现,需要编译器支持”,因为它依赖于成员的structure@ChrisMM“它们以这种方式存储在内存中”可能,但不一定。它不是“通常认为不安全的”。这只是一种未定义的行为,从定义上讲,它总是不安全的,从来没有用处或帮助。@ChrisMM我真的不明白。“而且你会看到问题……”是相当误导的。可能不会发现任何问题更具体地说,它们假设类的成员之间没有填充。事实上,在实践中,成员之间很可能没有填充。但是无论是否有填充,行为仍然是未定义的。注意:这种未定义行为的实际后果(假设真的没有填充)包括混淆优化器,使您的数字实际上不会写入任何地方,或者使其读取
x
而不是
y
,但仅在启用了某些选项的某些编译器上。更具体地说,它们假设类的成员之间没有填充。事实上,在实践中,成员之间很可能没有填充。但是无论是否有填充,行为仍然是未定义的。注意:这种未定义行为的实际后果(假设真的没有填充)包括混淆优化器,使您的数字实际上不会写入任何地方,或者使其读取
x
而不是
y
,但仅在启用了某些选项的某些编译器上。