2013-08-18 168 views
2

我偶然發現此類:在這種情況下,此運算符[]超載如何工作?

class Vec3f 
{ 
    ... 
    float x, y, z; 
    ... 
}; 

inline float operator[](const int index) const 
{ 
    return (&x)[index]; 
} 

inline float& operator[](const int index) 
{ 
    return (&x)[index]; 
} 

該類使用[]進入到X,Y,Z值的數組中,使得 v [0]是在X中的值,V [ 1]是y中的值,v [2]是z中的值,但是

  • return語句如何工作?
  • 讀取它是否正確:「從由x的地址開始的索引指定的地址中獲取值」?
  • Do(& x)必須在括號內,否則會返回x [index]的地址值,不是嗎?
+0

此代碼是依賴於如何特定的編譯器有效從技術上講,這不是有效的代碼。 –

回答

4

從技術上講,這不是有效的代碼。

但正在發生的事情:

// Declare four variables 
// That are presumably placed in memory one after the other. 
float x, y, z; 

在代碼:

return (&x)[index]; 

// Here we take the address of x (thus we have a pointer to float). 
// The operator [] when applied to fundamental types is equivalent to 
// *(pointer + index) 

// So the above code is 
return *(&x + index); 
// This takes the address of x. Moves index floating point numbers further 
// into the address space (which is illegal). 
// Then returns a `lvalue referring to the object at that location` 
// If this aligns with x/y/z (it is possible but not guaranteed by the standard) 
// we have an `lvalue` referring to one of these objects. 

它很容易使這項工作,是合法的:

class Vec3f 
{ 
    float data[3]; 
    float& x; 
    float& y; 
    float& z; 

    public: 
     float& operator[](const int index) {return data[index];} 

     Vec3f() 
      : x(data[0]) 
      , y(data[1]) 
      , z(data[2]) 
     {} 
     Vec3f(Vec3f const& copy) 
      : x(data[0]) 
      , y(data[1]) 
      , z(data[2]) 
     { 
      x = copy.x; 
      y = copy.y; 
      z = copy.z; 
     } 
     Vec3f& operator=(Vec3f const& rhs) 
     { 
      x = rhs.x; 
      y = rhs.y; 
      z = rhs.z; 
      return *this; 
     } 
}; 
+3

嗯,這是*法律*,它只是不正確*(也就是說,它可能並不總是做正確的事情) – greyfade

+0

是的,進一步的研究讓我知道這段代碼在很大程度上依賴於填充以保證其功能,是的,它可能是編譯器特定的,但是我在VS和GCC上用/不用#pragma pack(push,1)和#pragma pack(pop)對它進行了測試,它工作正常。我主要在C#中編程,所以我需要重新修改操作符重載。爲了完整性,我會等待其他答案,但我同意你的觀點。 – 2013-08-18 23:53:37

+0

我想這是/ legal /只有當這個類不包含虛擬方法時(代碼片段不會顯示它,但是在這個類中沒有虛擬方法)。 – 2013-08-19 00:00:55

相關問題