C++中訪問控制符有三個privtae、provected、public。public可以被所有人訪問,private出來該類的創(chuàng)建者和類的內(nèi)部成員方法外,均不能訪問,provected和private相似,不過繼承類可以訪問基類的保護(hù)成員不能直接訪問基類的私有成員。前些天有人對下面的代碼中的部分感到不可理解,貼出來說說的而我自己的看法。代碼如下:
using namespace std;
class RMB
{
public:
RMB(unsigned int d,unsigned int c);
friend RMB operator + (RMB&,RMB&);
friend RMB& operator ++ (RMB&);
void Display(RMB& a,RMB& b);
void Play(void)
{
int c = A+c;
}
private:
int A;
int C;
public:
void display()
{
cout << (yuan + jf / 100.0) << endl;
}
protected:
unsigned int yuan;
unsigned int jf;
};
void RMB::Display(RMB& a,RMB& b)
{
int k = a.A + b.C;//a為何能訪問private成員
int c = a.yuan;
//cout << "c=" << c << endl;
cout << "k=" << k << endl;
}
RMB::RMB(unsigned int d,unsigned int c)
{
yuan = d;
jf = c;
while(jf >= 100)
{
yuan ++;
jf -= 100;
}
A = d + 1;
C = c + 1;
}
RMB operator + (RMB& s1,RMB& s2)
{
unsigned int jf = s1.jf + s2.jf;//這里為何可以訪問protected成員,s1是RMB的類對象,jf是被protected成員
unsigned int yuan = s1.yuan + s2.yuan;
RMB result(yuan,jf);
return(result);
}
RMB& operator ++ (RMB& s)
{
s.jf++;
if (s.jf >= 100)
{
s.jf -= 100;
s.yuan ++;
}
return s;
}
int _tmain(int argc, _TCHAR* argv[])
{
RMB d1(1,60);
RMB d2(2,50);
RMB d3(10,10);
d3 = d1 + d2;
++ d3;
d3.Display(d1,d2);
d3.display();
getchar();
return 0;
}
乍一看,肯定通不過編譯,事實(shí)是可以正確的運(yùn)行,我用的是VC8編譯器。
RMB類的方法(Display、Paly)可以訪問它的protected和private成員,但是當(dāng)它的參數(shù)是RMB類對象的引用,為何也能訪問它的private和proteceted成員?看起來簡單的問題,但是很讓人思考,其實(shí)看看它們的作用域就明白了。protected和private只有類的內(nèi)部方法可以訪問,在看看函數(shù)形參數(shù)的作用域,就好解釋了。friend只是類的另一個接口,它打破了類的封裝性,很多人不提倡用它,但是我們姑且把它當(dāng)作類的一個緊急接口,不到萬不得已不用它就可以,它沒有訪問限制,位置放到哪里都一樣。
有些概念看起來簡單,但是要理解透徹,卻不是那么容易的,C++的許多概念都是如此,也是它的魅力所在。