正常來說,類外無法訪問類內的private成員,只能通過類內成員訪問private成員,在類外,無論是通過類指標還是類物件都無法直接訪問類中的private成員
c++類中的私友成員是不能通指標操作的。
#include
using namespace std;
class a
;int main()
void print()
private:
int m_i;
};int main(int argc, char **ar**)
執行結果:
在上面**中,a物件有乙個私有的資料成員m_i,原則上在類外部是不能對m_i進行訪問的。但是我們可以通過位址訪問物件的私有資料成員m_i。並且還對其進行了修改。執行結果也表明我們確實可以通過指標訪問物件的私有成員並且可以對其進行修改。因為物件本身作為乙個位址值,裡面存放的只有虛函式指標和成語變數,如果沒有虛函式指標那麼就可以直接訪問到第乙個成員變數,且乙個物件的大小就是這些,沒有成員函式,沒有static的成員變數。類的大小是虛函式表和一般的成員變數,也沒有成員函式。成員函式放在**區。m_i: 10
a::m_i: 10
m_i: 11
究其原因,在c++中訪問物件的資料成員,可以根據資料在物件中的偏移位址訪問。c++的物件其實就是乙個指標陣列。這個指標陣列存放的是物件的虛函式表和資料成員的位址,我們當然可以通過指標訪問物件的任何成員。我想著可能是c++為了相容c語言而留下的一些不是很安全的做法。
也可以採用類內寫乙個public介面,類外通過訪問這個介面操作私有變數,因類內成員可以訪問private成員
這種方式類似於建構函式設定成public,供編譯器呼叫。
class test
void print()
private:
int a = 10;
int b = 100;
};int main()
結果如下:
C 乙個類訪問另乙個類的私有成員和保護成員
友元類 class a friend class b private int aa class b public void output cout a.aa endl private a a 使用友元類時注意 1 友元關係不能被繼承。2 友元關係是單向的,不具有交換性。若類b是類a的友元,類a不一定...
C 中訪問私有成員
首先我必須承認訪問乙個類的私有成員不是什麼好做法。大家也都知道私有成員在外部是不能被訪問的。而乙個類中會存在很多私有成員 如私有字段 私有屬性 私有方法。對於私有成員訪問,可以套用下面這種非常好的方式去解決。private string name public string name set 但是有...
C 中訪問私有成員
首先訪問乙個類的私有成員不是什麼好做法。大家都知道私有成員在外部是不能被訪問的。乙個類中會存在很多私有成員 如私有字段 私有屬性 私有方法。對於私有成員造訪,可以套用下面這種非常好的方式去解決。private string name public string name set 但是有時候,源 是別...