2012-09-24 67 views
5

假設我有一兩個同軸函數的類:爲什麼允許內聯函數操作私有成員變量?

class Class { 
public: 
    void numberFunc(); 
    int getNumber() { return number; } 
private: 
    int number; 
}; 

inline void Class::numberFunc() 
{ 
    number = 1937; 
} 

我實例化類和我通話雙方的功能類:

int main() { 
    Class cls; 
    cls.numberFunc(); 
    cout << cls.getNumber() << endl; 
    return 0; 
} 

我明白,內聯函數仍然但這也是我的理解,即內聯函數體內的代碼只是插入到它被調用的地方。看來,作爲插入的結果,我不應該能夠直接訪問成員變量number,因爲據我所知,在main()編譯器的代碼是這樣:

main() { 
    Class cls; 
    cls.number = 1937; 
    cout << cls.number << endl; 
    return 0; 
} 

燦有人向我解釋爲什麼我仍然可以訪問這些私人成員,或根據我對內聯函數的理解糾正我?我知道編譯器可以選擇在某些函數上忽略inline;這裏發生了什麼?

輸出:

回答

9

訪問類的私有成員的規則由C++代碼上的編譯器執行。這些規則不直接適用於編譯器的輸出,編譯器是計算機執行的代碼。

4

private訪問指示符是對類的用戶(程序員)的限制,而不是在編譯器。只要程序的可觀察行爲是相同的,編譯器就可以做任何想做的事情。

+0

否 - 一致性編譯器不能做它想要的 - 訪問說明符在編譯的特定步驟中被評估 - 在它們沒有被再次檢查之後。 –

+2

@AdrianCornish:只要它符合要求,編譯器就可以隨時撤銷訪問級別,只要它看起來就像在特定步驟中進行評估一樣。 –

+0

不,它不能 - 給我看這個標題部分的內容嗎? –

6

關鍵字inline意味着程序員認爲如果編譯器想要在代碼中插入代碼,編譯器可能會這樣做。編譯器也可以在沒有關鍵字的情況下嵌入其他函數。編譯器可能認爲程序員是傻瓜,忽略關鍵字而不是內聯。它全部採用C++標準。

內聯成員函數是非常正常的成員函數。沒有其他特權或限制。

內聯不會導致函數由多個編譯單元(包含定義了內聯函數的頭文件)定義的錯誤。這可能是人們編寫內聯函數的一個原因。

+0

'inline'也允許違反ODR規則。 –

+0

我會添加它,謝謝,可能這就是爲什麼使用內聯的原因之一。 –

相關問題