c++的友元
2018-01-30 16:26
155 查看
先从书上的一个例子开始,明白为什么C++需要引入友元的概念。
这里认为你熟悉Point类(就是一个记录点的性质的类),如果我要由两个点
想想一下情况:假设我在Point类里实现了这个函数,那在此函数中必然要用到本类的实例化对象,因为要通过这个对象访问到它的数据成员来进行距离计算嘛。恩,想想也是可以的嘛。但是这样是有问题的,这个问题不在语法上(前面假设的没毛病),而在可读性上,毕竟距离是Point与Point之间的关系,所以它不应该属于“每一个单独的点,也不属于整个Point类”。
那直接写一个函数呢?语法上也是可以的,但问题是还是“不能体现这个函数与点之间的联系”。
写到这儿我觉得前面两种解决方式也未尝对此题不可,但是考虑到C++是一个面向对象的语言,一旦用于大型程序,这些“小聪明”可能就不中了。
那到底靠什么来联系这样一层关系?这就是友元机制了。
说明了友元机制的价值之后,具体用法参见维基百科:
在面向对象程序设计中,友元函数(friend function)是一个指定类(class)的“朋友”,该函数被允许访问该类中private、protected、public的数据成员。普通的函数并不能访问这些数据,然而宣告一个函数成为一个类的友元函数则被允许访问这些数据。
友元函数的宣告可以放在类声明的任何地方,不受访问限定关键字private、protected、public的限制。一个相似的概念是友谊类。
友谊关键字应该谨慎使用。如果一个拥有private或者protected成员的类,宣告过多的友元函数,可能会降低封装性的价值,也可能对整个设计框架产生影响。
还要强调的是,友元类“不继承,单向的,不传递”
这里认为你熟悉Point类(就是一个记录点的性质的类),如果我要由两个点
Point A和
Point B计算他们之间的距离,那么程序该如何设计呢?初学类与对象者的第一想法,在Point类里头再写一个函数呗。
想想一下情况:假设我在Point类里实现了这个函数,那在此函数中必然要用到本类的实例化对象,因为要通过这个对象访问到它的数据成员来进行距离计算嘛。恩,想想也是可以的嘛。但是这样是有问题的,这个问题不在语法上(前面假设的没毛病),而在可读性上,毕竟距离是Point与Point之间的关系,所以它不应该属于“每一个单独的点,也不属于整个Point类”。
那直接写一个函数呢?语法上也是可以的,但问题是还是“不能体现这个函数与点之间的联系”。
写到这儿我觉得前面两种解决方式也未尝对此题不可,但是考虑到C++是一个面向对象的语言,一旦用于大型程序,这些“小聪明”可能就不中了。
那到底靠什么来联系这样一层关系?这就是友元机制了。
说明了友元机制的价值之后,具体用法参见维基百科:
在面向对象程序设计中,友元函数(friend function)是一个指定类(class)的“朋友”,该函数被允许访问该类中private、protected、public的数据成员。普通的函数并不能访问这些数据,然而宣告一个函数成为一个类的友元函数则被允许访问这些数据。
友元函数的宣告可以放在类声明的任何地方,不受访问限定关键字private、protected、public的限制。一个相似的概念是友谊类。
友谊关键字应该谨慎使用。如果一个拥有private或者protected成员的类,宣告过多的友元函数,可能会降低封装性的价值,也可能对整个设计框架产生影响。
还要强调的是,友元类“不继承,单向的,不传递”
相关文章推荐
- 【代码备忘】今天突然写的一个比较奇葩的C++ 代码,模版,friend,友元...
- C++_模板类的友元运算符重载_原理
- C++ 友元(共享数据)
- C++:友元(非成员友元函数、成员友元函数、友元类)
- C++:成员运算符重载函数和友元运算符重载函数的比较
- 《C++ Primer Plus(第六版)》(31)(第十五章 友元、异常和其他 笔记)
- C++操作符重载 友元基础教程
- C++中的友元(二)
- C++ 模板中定义友元
- C++之静态成员和友元
- C++操作符重载,友元;
- 从零开始学C++之友元:友元函数和友元类
- C++ 中友元的一些总结
- c++基础要点整理(二)之——友元
- [C++]友元关系的继承性
- 浅谈C++中的友元关系
- C++友元
- C++ 友元 friend
- C++基础--友元
- 基于c++的运算符重载(二、数组非友元)