友元关系可以继承_C++类的友元(学习笔记:第5章 05)

类的友元[1]

  • 友元是C++提供的一种破坏数据封装和数据隐藏的机制。
  • 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。
  • 可以使用友元函数和友元类。
  • 为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。
    友元函数

友元函数

  • 友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问 private 和 protected成员。
  • 作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。
  • 访问对象中的成员必须通过对象名。

例5-6 使用友元函数计算两点间的距离

#include 

2e0fcda7c722a5b22d8767bde2499c46.png
程序运行结果

这个程序的一个隐患:

如果传引用作参数的话,它是可以双向传递的效果,也就是说,如果在这个函数中有什么失误,写错了或者不合适了,将参数a 参数b的x坐标y坐标修改了也是有可能的。这一种情况肯定不是这个类授权给dist函数的本意。这个类将dist函数设为友元,授权给它能访问私有成员只是希望它能够读取这些数据来用,并且使用的效率高一点,但是不希望在类体里面因为一些什么意外情况,将a和b这两个点的数据修改。但是现在确实有这个隐患。
如何把它解决好?答: 常引用作形参 [2]

友元类

  • 若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员。
  • 声明语法:将友元类名在另一个类中使用friend修饰说明。

1bf9e40e18d778a6a3ed7a6b42aed7b4.png
  • 对上图友元类的解释:
定义了一个类a,又定义一个类b。类b里面的成员是a的对象,这是一个类的组合。b是组合类, a是部件类。
在b类中定义了一个set函数,想用这个函数来设置它成员的值,虽然a是b的组件,但是a里面的数据成员x是私有成员,所以b类的函数是没有权限直接访问对象a的数据成员x。
假设需要用a.x的方式去访问x,并给它赋值,可以在a类的设计中将b类说明成a类的友元。这就是一种授权,授权b类的所有函数能够直接访问a类的私有成员。所以经过这友元的声明以后,在b类的set函数中就可以直接给a.x赋值了。
所以定义这个友元是一种对外的授权,这个授权要在十分必要的时候才这样用,要慎用。如果你授权给很多友元类,友元函数以后,类里面的私有成员,它的安全性就有问题了。
class A {
friend class B;
public:
void display() {
cout << x << endl;
}
private:
int x;
};

class B {
public:
void set(int i);
void display();
private:
A a;
};
void B::set(int i) {
a.x=i;
}
void B::display() {
a.display();
};
  • 类的友元关系是单向的

如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有、保护数据。

参考

  1. ^http://www.xuetangx.com/courses/course-v1:TsinghuaX+00740043X_2015_T2+sp/courseware/4d6535a7a38741b1be7698f6696a1e4d/702f7db1143f4d87ae0486a002b3b6f4/
  2. ^https://zhuanlan.zhihu.com/p/98091622
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值