我們先來看一個例子
1 #include 2 using namespace std; 3 class CPoint 4 { 5 public: 6 CPoint(int xx, int yy) 7 { 8 x = xx; 9 y = yy; 10 } 11 CPoint(const CPoint &p):x(p.x),y(p.y) <===這里的復制構造函數對象p竟然能直接訪問自己的私有成員??腫么回事 12 { 13 14 } 15 private: 16 int x, y; 17 };
我們初學者一般看書循序漸進容易犯的一個誤區:
一般我們都是通過對象調用成員函數來調用私有成員。而且書上不是說私有成員不能訪問私有數據成員,只能通過成員函數訪問嗎?
那么對象能不能直接訪問私有成員?
為什么拷貝構造函數的參數可以直接去訪問它自己的私有成員?這么做合法嗎?
之所以會有上面的那個疑問,無疑的就是進入了一個認識誤區——對象是不可以直接訪問私有成員的。
但是這個真的是個超級大的誤區。
我們先來看,私有,公有,受保護的,是針對什么東西來談的:不是針對對象來說的,是針對於類來說的。是用來限定類外的東西訪問類內的東西是有限制的。從來不是對對象而言的。封裝是編譯期的概念,是針對類型而非對象的,在類的成員函數中可以訪問同類型實例對象的私有成員變量.
首先,我們經常考到在類定義中,成員函數可以直接調用私有成員,他怎么沒有經過對象啊?例如:
1 class A 2 { 3 private: 4 long shares; 5 double share_val; 6 double total_val; 7 void set_tot(){ total_val=shares * share_val ;} 8 }
1.為什么類中的成員函數可以訪問到私有的數據成員?
你可能認為它就是可以訪問,沒有為什么。不對,又為什么,就是因為它在類內。因為成員函數在類體里!!
2.為什么主函數中定義的對象不能訪問它的私有成員?
你可能認為因為它是對象,對象是不能訪問到私有成員的。不對,是因為它在類外,與對象不能訪問一點關系都沒有。
對象能否訪問到私有成員與其定義的位置有關:在類內定義,可以訪問,在類外定義,不能訪問。
再來看一個例子
1 class CPoint 2 { 3 public: 4 CPoint(int xx, int yy) 5 { 6 x = xx; 7 y = yy; 8 } 9 friend class distance; 10 private: 11 int x, y; 12 }; 13 14 class distance 15 { 16 public: 17 double point_to_oralpoint(CPoint p1) 18 { 19 return sqrt(p1.x*p1.x + p1.y*p1.y); <<====為什么在類外定義的函數竟然可以訪問到上面類的私有成員? 20 } 21 };
OH!SHIT!
在類CPoint里面聲明了distance為它的友元類,CPoint把distance當朋友(distance未必把CPoint當朋友哦~,所以CPoint並不能訪問到distance的成員)。
CPoint把distance當朋友,distance可以通過他定義的函數中的參數表去訪問到CPoint里面的私有成員,這個私有數據成員是對其公開的,就相當於是在distance的類中,但是要通過參數(CPoint的對象)去指明這是那個對象的數據成員而已。
而這個就是最普遍的需要被了解的類外如何訪問類內的私有成員的知識點了。
————————————————
版權聲明:本文為CSDN博主「Jeff_」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_40539125/article/details/84205194
