2014-06-24 57 views
2

我不明白我在這裏提供的代碼中提到的兩行。爲什麼我需要使用int*?我如何訪問私有變量?我不確定我在做這兩行。請詳細解釋。C++中指針類型轉換的解釋

有問題的線路:

int *p = (int *) &s; 
*p=10; 

主代碼:

#include <iostream> 

using namespace std; 

class sample { 
private: 
    int a; 
public: 
    void function() { 
    a=5; 
    } 
    void printA() { 
    cout<<"value is "<<a<<endl; 
    } 
}; 

int main() { 
    sample s; 
    s.function(); 
    s.printA(); 

    int *p = (int *) &s; 
    *p=10; 

    s.printA(); 
} 
+0

你只是簡單地可以添加任何虛擬方法,在VS和gcc「a」不會被改變。 – Arkady

回答

5

使用(int*)有一個非常糟糕的主意。你正在使用一個不是int的類作爲int。哪個不好。

您不能訪問私人會員,也不應該這麼做,這就是爲什麼他們是私人會員。

int *p = (int *) &s; 
*p=10; 

這意味着,你有一個對象ssample型的,並且它具有數據成員int a;。你寫的作品,因爲a恰好在課程的開始。

有些情況下,一個類的佈局保證,你可以在這裏讀到它:

1

此代碼試圖打破由類的幫助下實施的封裝訪問該成員asample類指針投射。這是不安全,因爲它取決於類成員的內存佈局。

的假設是,該構件a將處於sample對象的起始位置,因此服用對象的地址,並將其鑄造int*將使得能夠訪問第一int構件。

這是行得通的,因爲a確實處於第一位置,但這不能保證,並且由於填充/對齊和繼承層次結構的情況而不適用於其他成員。這種類型的代碼是危險的。

如果需要,您應該擁有私有成員的訪問者/修改者,而不是編寫這種類型的代碼來訪問他們。

+0

「這是不能保證的」 - 是的(自C++ 11以來),除非你改變類,所以它不再是標準佈局。我同意這很危險,因爲這樣的改變會悄悄地破壞代碼;但是如果你真的需要的話,你可以(可移植地)依靠這樣一個班級的佈局。 –

2

首先,請永遠不要這樣做。

您正在利用類sample的內存佈局。第一個成員是int,它位於班級內存空間的開始處。

嘗試在a之前添加另一個int,您會看到a未被更改。