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;
}

 

private:只能由1.该类中的函数、2.其友元函数访问。
不能被任何其他访问,该类的对象也不能访问。

protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
但不能被该类的对象访问。

public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。
 
注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。

 

乍一看,肯定通不过编译,事实是可以正确的运行,我用的是VC8编译器。
RMB类的方法(Display、Paly)可以访问它的protected和private成员,但是当它的参数是RMB类对象的引用,为何也能访问它的private和proteceted成员?看起来简单的问题,但是很让人思考,其实看看它们的作用域就明白了。protected和private只有类的内部方法可以访问,在看看函数形参数的作用域,就好解释了。friend只是类的另一个接口,它打破了类的封装性,很多人不提倡用它,但是我们姑且把它当作类的一个紧急接口,不到万不得已不用它就可以,它没有访问限制,位置放到哪里都一样。
有些概念看起来简单,但是要理解透彻,却不是那么容易的,C++的许多概念都是如此,也是它的魅力所在。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值