Иль*_*йда 1 c++ overloading operator-keyword
例如:
int x = 5;
std::cout<<(&x)[0]<<std::endl; -> prints 5
Run Code Online (Sandbox Code Playgroud)
我在一本书中发现了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]);
}
};
Run Code Online (Sandbox Code Playgroud)
并将其用作:
Vector3D myVec(0,2,3);
std::cout<<myVec[0]<<std::endl;
std::cout<<myVec[1]<<std::endl;
std::cout<<myVec[2]<<std::endl;
Run Code Online (Sandbox Code Playgroud)
它将打印x,y,z的值
怎么运行的?这安全吗?
当您执行操作时,&x将获得指向的指针x。当您执行pointer[N]编译器的操作时,会将其转换为*(pointer + N)。在你的代码,因为N是0我们只剩下*(&x)这是刚刚提领我们刚刚创建回馈变量本身的指针。
您在其中找到的代码实际上是未定义的行为。他们什么时候做
float & operator[](int i){
return ((&x)[i]);
}
Run Code Online (Sandbox Code Playgroud)
他们假定类中没有填充,并将3个单独的成员视为数组。但是,无法进行此假设,并且该访问被明确地称为标准中未定义的行为。
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |