Don';我不太明白&;运算符在此结构中所做的操作以及它如何能够访问其他成员变量 我开始掌握C++,我想我会学习创建向量并对它们进行操作,这样我就可以掌握指针和引用。 也许我已经看得太久了,但我不太确定我所跟随的书中与return语句相关的代码部分发生了什么,更具体地说是return((&x)[I])零件。 如下所列: float& operator [](int i) { return ((&x)[i]); }

Don';我不太明白&;运算符在此结构中所做的操作以及它如何能够访问其他成员变量 我开始掌握C++,我想我会学习创建向量并对它们进行操作,这样我就可以掌握指针和引用。 也许我已经看得太久了,但我不太确定我所跟随的书中与return语句相关的代码部分发生了什么,更具体地说是return((&x)[I])零件。 如下所列: float& operator [](int i) { return ((&x)[i]); },c++,struct,C++,Struct,我的理解是,&-address操作符将为您提供特定变量的地址。现在,如果我没记错的话,指针和数组是齐头并进的,所以当你得到一个对x变量的引用,比如so(&x)[I],你可以使用偏移操作符访问下一个元素,但我不知道你可以用structs这样做 我是走对了路还是迷路了 使用以下链接帮助我: struct Vector3D { 浮动x,y,z; Vector3D()=默认值; 矢量3D(浮点a、浮点b、浮点c) { x=a; y=b; z=c; } 浮点和运算符[](int i) { 回报((&x)

我的理解是,
&
-address操作符将为您提供特定变量的地址。现在,如果我没记错的话,指针和数组是齐头并进的,所以当你得到一个对
x
变量的引用,比如so
(&x)[I]
,你可以使用偏移操作符访问下一个元素,但我不知道你可以用structs这样做

我是走对了路还是迷路了

使用以下链接帮助我:

struct Vector3D
{
浮动x,y,z;
Vector3D()=默认值;
矢量3D(浮点a、浮点b、浮点c)
{
x=a;
y=b;
z=c;
}
浮点和运算符[](int i)
{
回报((&x)[i];
}
常量浮点和运算符[](int i)常量
{
回报((&x)[i];
}
};
int main(int argc,char const*argv[]
{
Vector3D vec=Vector3D(1,2,3);
自动测试=向量[1];
std::cout什么

does是获取
x
的地址,然后使用
[i]
,它从
x
获取
i
偏移量处的对象。基本上,你是在假装你有一个
int
数组,而不是3个独立的
int
,其中
x
是数组的第一个元素

这是一种未定义的行为,但有几个原因。首先,您无法访问超出数组边界的元素。对象可以被视为一个数组,因此
(&variable)[0]
是合法的,因为它只是
变量
(忽略
&
可能被重载)因此,除
0
之外的任何索引都是UB。其次,允许编译器在类的成员变量之间添加填充。这意味着,如果不声明类是您期望的大小,您就无法知道
y
z
在内存中与
x
相邻

编写函数的正确方法是使用switch语句,如

float& operator [](int i)
{
    switch(i)
    {
        case 0: return x;
        case 1: return y;
        case 2: return z;
        default: // throw an exception or return one of the members or do something else to indicate an error
    }
}
什么

does是获取
x
的地址,然后使用
[i]
,它从
x
获取
i
偏移量处的对象。基本上,你是在假装你有一个
int
数组,而不是3个独立的
int
,其中
x
是数组的第一个元素

这是一种未定义的行为,但有几个原因。首先,您无法访问超出数组边界的元素。对象可以被视为一个数组,因此
(&variable)[0]
是合法的,因为它只是
变量
(忽略
&
可能被重载)因此,除
0
之外的任何索引都是UB。其次,允许编译器在类的成员变量之间添加填充。这意味着,如果不声明类是您期望的大小,您就无法知道
y
z
在内存中与
x
相邻

编写函数的正确方法是使用switch语句,如

float& operator [](int i)
{
    switch(i)
    {
        case 0: return x;
        case 1: return y;
        case 2: return z;
        default: // throw an exception or return one of the members or do something else to indicate an error
    }
}

如果你想学C++,那就扔掉教程,代码中有恐怖的用法,不应该被使用。啊哈,我实际上把主题写下来了,或者直到它把我弄糊涂了才用它,所以它到底在做什么?至少我是沿着理解它的线。<代码>但是我不知道你会不会。d使用结构执行此操作。
您不能。这是未定义的行为。它可能出于逻辑原因工作,但代码无效。请勿使用此操作或向任何人学习此操作。
&x
不是引用。它是指向x的指针。因此,
(&x)[1]是GLValy,Y,因为Y在X之后被放置在结构中。但是,不要这样写代码。它显示了希望C++显示的方式。任何指示这类事情的指令或书都应该煞费苦心地说它是可怕的编码风格。那么,这是在bin中进行的,请把教程扔掉,而不是U。从你想学习C++的书中看一本书。代码中有恐怖的做法,不应该使用。AHHHMAN,我实际上已经把主题降下来或操作使用,直到这本书把我弄糊涂了,所以它到底在做什么?至少我是沿着理解它的线。<代码>但是我不知道你可以用结构来做。<代码>你可以。不可以。这是未定义的行为。它可能出于逻辑原因工作,但代码无效。请勿使用此行为或向任何人学习此行为。
&x
不是参考。它是指向x的指针。因此,
(&x)[1]是GLValy,Y,因为Y在X之后被放置在结构中。但是,不要这样写代码。它显示了希望C++显示的方式。任何指示这类事情的指令或书都应该煞费苦心地说它是可怕的编码风格。那么,这是在bin中进行的,它会使更多的血统变得更为血腥。e、 事实上,我想知道为什么它是这样写的,首先,干杯。我将挑选一本推荐的书作为一个很好的参考。省去了
默认值
,让UB发生在越界访问的情况下,让clang优化所有这一切,以达到一个可爱的目的:)是否分配相同类型的后续数据成员结构中的ed顺序似乎是实现定义的(见12.2.17),而不是UB。因此,不可移植。但是,仍然存在超出类型界限的访问,该界限是UB,因为