先貼代碼:
#includeusing namespace std;
class CPoint
{
public:CPoint(int xx, int yy){x = xx;y = yy;}CPoint(const CPoint &p){x = p.x;y = p.y;}
private:int x, y;
};
如果你在想為什么拷貝構造函數的參數可以直接去訪問它自己的私有成員的話,你就需要好好的看完這篇文章。如果你沒有在想,那么很好,這篇文章就隨它去吧~
===============================================================================================================================
進入正文:
之所以會有上面的那個疑問,無疑的就是進入了一個認識誤區——對象是不可以直接訪問私有成員的。
但是這個真的是個超級大的誤區。
我們先來看,私有,公有,受保護的,是針對什么東西來談的:不是針對對象來說的,是針對于類來說的。是用來限定類外的東西訪問類內的東西是有限制的。從來不是對對象而言的。
如果還不是很清楚上面的表述,我們舉幾個例子來看:
1.為什么類中的成員函數可以訪問到私有的數據成員?
你可能認為它就是可以訪問,沒有為什么。不對,又為什么,就是因為它在類內。
2.為什么主函數中定義的對象不能訪問它的私有成員?
你可能認為因為它是對象,對象是不能訪問到私有成員的。不對,是因為它在類外,與對象不能訪問一點關系都沒有。
對象能否訪問到私有成員與其定義的位置有關:在類內定義,可以訪問,在類外定義,不能訪問。
到這里我們也就理解了最開始貼的那個代碼了~
再貼一個代碼:
#includeusing namespace std;
#includeclass CPoint
{
public:CPoint(int xx, int yy){x = xx;y = yy;}friend class distance;
private:int x, y;
};
class distance
{
public:double point_to_oralpoint(CPoint p1){return sqrt(p1.x*p1.x + p1.y*p1.y);}
};
好啦,我們現在又發現了一個和上面說的貌似有點違背的東西:為什么在類外定義的函數竟然可以訪問到上面類的私有成員?
因為:
在類CPoint里面聲明了distance為它的朋友類,CPoint把distance當朋友(distance未必把CPoint當朋友哦~,所以CPoint并不能訪問到distance的成員)。
CPoint把distance當朋友,distance可以通過他定義的函數中的參數表去訪問到CPoint里面的私有成員,這個私有數據成員是對其公開的,就相當于是在distance的類中,但是要通過參數(CPoint的對象)去指明這是那個對象的數據成員而已。
而這個就是最普遍的需要被了解的類外如何訪問類內的私有成員的知識點了。