C++中访问控制符有三个privtae、provected、public。public可以被所有人访问,private出来该类的创建者和类的内部成员方法外,均不能访问,provected和private相似,不过继承类可以访问基类的保护成员不能直接访问基类的私有成员。前些天有人对下面的代码中的部分感到不可理解,贴出来说说的而我自己的看法。代码如下:
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;
}
乍一看,肯定通不过编译,事实是可以正确的运行,我用的是VC8编译器。
RMB类的方法(Display、Paly)可以访问它的protected和private成员,但是当它的参数是RMB类对象的引用,为何也能访问它的private和proteceted成员?看起来简单的问题,但是很让人思考,其实看看它们的作用域就明白了。protected和private只有类的内部方法可以访问,在看看函数形参数的作用域,就好解释了。friend只是类的另一个接口,它打破了类的封装性,很多人不提倡用它,但是我们姑且把它当作类的一个紧急接口,不到万不得已不用它就可以,它没有访问限制,位置放到哪里都一样。
有些概念看起来简单,但是要理解透彻,却不是那么容易的,C++的许多概念都是如此,也是它的魅力所在。