本文内容来自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结
友元的概念
什么是 友元 ?
友元是 C++ 中的 一种关系
友元关系发生在 函数与类之间 或者 类与类之间
友元关系是 单项的, 不能传递
友元的用法
在类中以 friend 关键字声明友元
类的友元可以是 其它类或者具体函数
友元 不是 类的一部分
友元 不受 类中访问级别的限制
友元可以直接访问具体类的所有成员
在类中使用 friend 关键字对 函数 或 类 进行声明
实验
我们定义一个函数 func 作为类 Test 的友元函数,在 func 函数内部访问 Test 对象的私有成员
#include <stdio.h>
class Test
{
private:
int m_i;
int m_j;
public:
Test(int i, int j);
friend void func(Test& p);
};
Test::Test(int i, int j)
{
m_i = i;
m_j = j;
}
void func(Test& p)
{
printf("p.m_i = %d\n", p.m_i);
printf("p.m_j = %d\n", p.m_j);
}
int main(void)
{
Test t1(1, 2);
func(t1);
return 0;
}
运行结果
实验结果:友元函数 func 成功的访问了 t1 对象的私有成员 m_i 和 m_j 。
友元的尴尬
友元是为了 兼顾 C 语言的高效 而诞生的
友元 直接破坏了 面向对象的封装性
友元在实际产品中的 高效是得不偿失的
友元在现代软件工程中 已经逐渐被遗弃
注意事项
友元关系 不具备传递性
类的友元可以是 其他它的成员函数
类的友元可以是 某个完整的类(所有的成员函数都是友元)
友元关系不具备传递性,如ClassA和ClassB是友元关系,ClassB和ClassC是友元关系,但ClassA和ClassC不是友元关系
小结
友元是为了 兼顾 C 语言的高效 而诞生的
友元 直接破坏了 面向对象的封装性
友元关系 不具备传递性
类的友元可以是其它类的成员函数
类的友元可以是 某个完整的类