前言
在C++编程中,友元(friend)是一种特殊的关系,允许一个类或函数访问另一个类中的私有成员。
一、什么是友元
1.友元 的定义:
友元在C++中可以被用于类和函数。对于类来说,可以创建一个友元类或友元函数。友元类可以 直接访问其它类的私有成员 ,而友元函数可以访问某一个类的私有成员。
2.友元 的声明:
在类定义中,可以使用 friend 关键字声明一个类或函数为友元。声明通常放在类的访问说明符(public、private、protected)之间。
友元 关系发生在函数与类之间 或者 类与类 之间。
class MyClass { private: int privateData; public: friend class FriendClass; // 友元类声明 friend void FriendFunction(); // 友元函数声明 };
二、友元的特性
1.局限性
友元的使用应该谨慎,并且遵循信息隐藏的原则。友元的目的是提供更灵活的访问权限,但也可能破坏封装性和安全性。应该尽量避免滥用友元,只在必要的情况下使用。
2.友元 关系的传递性
友元 关系不能传递,友元 关系 是单向的。 即使一个类 A 是类 B 的友元,类 B 的友元类不会自动成为类 A 的友元。
如果 A 是 B 的友元, B 是 C 的友元,则 C 不是 A 的友元,不可以传递使用。
三、示例代码
- 示例一:
友元函数允许函数访问类中的私有成员。被声明为友元的函数可以直接访问友元类的私有成员。
class Point { int a, b; // a,b 是类的私有成员 public: Point(int a, int b) { this->a = a; this->b = b; } friend void fun(Point&p); //声明 友元 函数 }; void fun(Point& p) { printf("a = %d, b = %d\n",p.a,p.b); //在 fun 函数内可直接访问 类的私有成员 } int main(void) { Point p(1,2); fun(p); return 0; }
- 示例 二
友元类允许一个类访问另一个类中的私有成员。被声明为友元的类可以直接访问友元类的私有成员。
class name1 { const char* n; public: name1(const char* n) { this->n = n; } friend class name2; // 声明 友元 类 }; class name2 { public: void GetName1(name1& name) // 打印 name1 类的名字 { printf("name1 ==> %s\n", name.n); // 访问 私有成员 } }; int main(void) { name1 n1("hello"); name2 n2; n2.GetName1(n1); return 0; }
总结
友元是一个强大的特性,但应谨慎使用。正确理解和使用友元关系,可以在需要的时候提供更灵活的访问权限,同时保持良好的封装性和安全性。在设计类和函数时,考虑友元是否需要,并仔细评估其对程序结构的影响。