何種情況下可以用物件名直接訪問私有變數

2021-06-16 11:16:51 字數 878 閱讀 5127

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

class ctest ;

ctest::ctest(int i):value(i)

{cout<<"contructor of ctest"<

疑惑:為什麼第31行和第37行**可以編譯通過,而第43行和第44行**會產生編譯錯誤?

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

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

1.確定符號的查詢域

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

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

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

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

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

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

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

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

哪種情況下用哪種域物件

原則 四個域物件在選擇的時候,能用範圍小的絕不用範圍大的 page 資料只是暫時存在集合,在jsp頁面的其他地方要用,用page 頁面中自定義的map 什麼時候需要用map了,就用page request 資料只是做顯示的,看完了就沒用了,就存request域 請求 servlet 產生的處理結果 ...

什麼情況下用遞迴?

遞迴的特點,可以看出遞迴可以大大縮短程式的 有意識的使用遞迴,可以用較短的 解決一些複雜的問題。甚至有些問題非得使用遞迴解決不可。那麼什麼時候我們該使用遞迴呢?遞迴演算法的 基本思想 是 把規模大的 較難解決的問題變成規模較小的 易解決的同一問題。規模較小的問題又變成規模更小的問題,並且小到一定程度...

PCB 什麼情況下可以敷銅,什麼情況下不能敷銅?

路面積,敷銅作用主要有兩個方面 1 可以起到一定的回流作用,當然,如果板層較多且層設定合理,敷銅回 流的作用就很小 2 可以起到一定的遮蔽作用,將上下層兩個覆銅平面想象成無限大,就成 了乙個遮蔽盒,敷銅永遠做不到這點,就像機箱一樣。從以上兩點出發,敷銅要看具體情況 1 對於需要嚴格阻抗控制的板子,不...