2017-05-03 31 views
0

我想要自己構建一個2D矢量類。這個[]運算符是如何重載的?

當我找別人來實現示例代碼,我發現這一點:

class Vector2D { 
public: 

    // components 
    double x, y; 

    Vector2D() : x(0.0), y(0.0) { } 

    // returns reference to the specified component (0-based indexing: x, y) 
    inline double& operator[] (const int& index) { 
    return (&x)[ index ]; 
    } 
} 

是如何[]運營商超載?我如何理解(&x)[index]

+9

你發現垃圾。將您的學習材料更改爲[合理](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list/388282)。 – nwp

+3

我相信這個例子是未定義的行爲。它依賴'y'在內存中的'x'之後,我不確定這是否有保證。 –

+3

'const int&index'是過早的悲觀主義。它增加了一個間接層,沒有任何收益。 –

回答

5

運算符[]是如何重載的?

不好。

我如何理解(&x)[index]

這是一行代碼,假設我們可以安全地在類的成員之間使用指針算術進行導航。我們不能。代碼被破壞。

此外,通過const引用取得int只是愚蠢的;這對於優化器來說基本上沒有任何用處。 int s很小,甚至可能是較小的比您的編譯器可能需要的「底層」實現此引用的指針。

+0

對第一個答案有+1,詳細和清晰。 –

+0

我不會確定它是壞的;標準佈局(實際上,它甚至是POD),並且標準爲標準佈局類的內存佈局提供了更強的保證。 –

+1

@MatteoItalia:不管它們的佈局是什麼,你都不能使用指針運算來「跳」這樣的對象。 C++ 14 5.7/5很清楚這是UB。 –