Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 276, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

C++中的访问控制探究

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++的许多概念都是如此,也是它的魅力所在。

posted on 2009-03-01 10:23 Benjamin 阅读(720) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理