C 私有成員變數的理解

2021-06-19 13:43:23 字數 1048 閱讀 7073

然而,在實現拷貝建構函式和賦值符函式時,在函式裡利用物件直接訪問了私有成員變數,因而,產生了困惑.下面以具體例項進行說明:

疑惑:為什麼第26行和第32行**可以編譯通過,而第39行和第40行**會產生編譯錯誤?

1

class

ctest ;

1011 ctest::ctest(int

i):value(i)

1215

16 ctest::ctest(const ctest&rhs):value(rhs.value)

1720

21 ctest& ctest::operator=(const ctest&rhs)

2229

30void ctest::printctest(const ctest&rhs)

3134

35int

main()

36

產生這種疑惑的原因是自己對私有成員變數的理解有誤,封裝是編譯期的概念,是針對型別而非物件的,在類的成員函式中可以訪問同型別例項物件的私有成員變數.

具體的解析如下:從變數value的符號是怎麼解析的分析.

1.確定符號的查詢域

如第26行**,當編譯器發現value變數時,它會在value變數所屬的物件rhs的類域中尋找該符號.

2.確定當前域中哪些符號可以訪問

由第1步可知,當前查詢的域是類域,而printctest函式在ctest類體中,所以printctest可以訪問ctest類中的所有變數(包括私有成員變數),因而value符號在ctest類域中被找到.

如第39行**,main函式不在ctest類體中,所以main函式不可以訪問ctest類域中的私有成員變數.

3.符號已查詢到,編譯通過

類成員變數的訪問許可權是編譯器強加的,編譯器可以找到value,通過編譯,自然就可以訪問到value變數的值.

直覺上,我們會以為第26行**中value符號的查詢域應該是物件rhs對應的作用域,然而c++編譯器的實現卻是在物件rhs的類域查詢value符號.

啟發:有些直覺是靠不住的,需要深入分析其背後的實現原理,才可以理解透徹.

C 私有成員變數的理解

私有成員變數的概念,在腦海中的現象是,以private關鍵字宣告,是類的實現部分,不對外公開,不能在物件外部訪問物件的私有成員變數 然而,在實現拷貝建構函式和賦值符函式時,在函式裡利用物件直接訪問了私有成員變數,因而,產生了困惑 下面以具體例項進行說明 1 class ctest 1011 ctes...

C 參考 私有成員變數的理解

私有成員變數的概念,在腦海中的現象是,以private關鍵字宣告,是類的實現部分,不對外公開,不能在物件外部訪問物件的私有成員變數 然而,在實現拷貝建構函式和賦值符函式時,在函式裡利用物件直接訪問了私有成員變數,因而,產生了困惑 下面以具體例項進行說明 疑惑 為什麼第26行和第32行 可以編譯通過,...

C 中訪問私有成員

首先我必須承認訪問乙個類的私有成員不是什麼好做法。大家也都知道私有成員在外部是不能被訪問的。而乙個類中會存在很多私有成員 如私有字段 私有屬性 私有方法。對於私有成員訪問,可以套用下面這種非常好的方式去解決。private string name public string name set 但是有...