C 類中對同類物件private成員訪問

2021-09-29 19:47:12 字數 1269 閱讀 1328

本文**:

私有成員變數的概念,在腦海中的現象是,以private關鍵字宣告,是類的實現部分,不對外公開,不能在物件外部訪問物件的私有成員變數.

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

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

class ctest ;

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

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

具體的解析如下:從變數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++的訪問修飾符的作用是以類為單位,而不是以物件為單位。

通俗的講,同類的物件間可以「互相訪問」對方的資料成員,只不過訪問途徑不是直接訪問.

步驟是:通過乙個物件呼叫其public成員函式,此成員函式可以訪問到自己的或者同類其他物件的public/private/protected資料成員和成員函式(類的所有物件共用),而且還需要指明是哪個物件的資料成員(呼叫函式的物件自己的成員不用指明,因為有this指標;其他物件的資料成員可以通過引用或指標間接指明)

如何對類中的private方法進行測試?

問題 如何對類中的private方法進行測試?大多數時候,private都是給public方法呼叫的,其實只要測試public即可。但是有時由於邏輯複雜等原因,乙個public方法可能包含了多個private方法,再加上各種if else,直接測public又要覆蓋其中每個private方法的n多情...

C 中對類和物件基礎理解

c 中對類和物件基礎理解 c 不是純物件導向的程式語言,而是基於物件導向的語言,因為c 中包含c語言的部分,而c語言是面向過程的。物件導向的三大特性 封裝 繼承 多型。封裝 將方法和資料封裝在類裡面,可以根據訪問限定符的使用保證資料的安全性,隱藏了方法的實現細節,也方便使用。繼承 對已有類增加屬性和...

C 在類中可以訪問同類物件的私有成員

今天在實現string類的拷貝建構函式時,發現可以直接使用引數物件去訪問該類的私有成員。string const string s copy拷貝建構函式 str new char strlen s.c str size s.size capacity s.capacity private char ...