2015-01-07 77 views
0

在C++的「this」指針上執行指針運算有什麼合法和/或有趣的用法?「this」指針上的指針運算

爲了讓SE對這個問題的長度感到滿意,我將包含一些相關的代碼。

class Foo 
{ 
public: 
    Foo(bool terminate = false) 
     : _data(terminate ? -1 : 0) 
    {} 

    void Bar(void) 
    { 
     if (_data >= 0) 
     { 
      _data++; 
      this[1].Bar(); 
     } 
    } 

private: 
    int _data; 
}; 

void main() 
{ 
    std::vector<Foo> vec; 
    vec.push_back(Foo()); 
    vec.push_back(Foo()); 
    vec.push_back(Foo()); 
    vec.push_back(Foo()); 
    vec.push_back(Foo(true)); 

    vec[2].Bar(); 
} 
+6

這樣做沒有合理的理由,因爲對象不應該知道它是連續數組的成員(這是假定的)。而你的代碼是無限遞歸的。 –

+5

我不認爲長度會成爲這個問題的不滿之源。 –

+1

堆棧溢出不是「向程序員詢問什麼」。這不是納姆,這裏有規則。 – Yakk

回答

4

簡答:不。

當然,你會用各種各樣的黑魔法,例如,訪問前面或後面的數組元素,像你所示的那樣,通過指針偏移量訪問基類的私有成員,或者從內存位置獲取對象的「唯一」ID,只要它從不移動。但是,這一切很可能會在某個時候適得其反,而我所能想到的一切都是更安全的解決方案。

我能想到的一個合法用途是對齊檢查。假設你有一個需要16字節對齊的類float4,你可以在構造函數中放置一個保證(((uintptr_t)(const void *)(this)) % 16 == 0)的斷言。

0

這是合法的,但正如評論告訴你的那樣,這是可怕的風格。

除非您是編寫一致性測試的工具鏈開發人員,否則不應該這樣做。