C++ 笔记 友元(面向对象)
C 笔记面向对象友元在 C 面向对象的封装特性中类会将私有成员private和保护成员protected隐藏起来仅允许类自身的成员函数访问。但在实际开发中我们有时需要让外部的函数或其他类直接访问一个类的非公有成员 —— 这就是友元friend的作用。友元是 C 提供的一种突破封装的机制它允许外部函数或类访问另一个类的私有 / 保护成员。本文将从概念、分类、用法、优缺点四个维度全面讲解友元的使用。一、友元基础概念1. 核心定义友元使用friend关键字声明的外部函数或外部类可以直接访问当前类的所有成员包括 private、protected。2. 核心特点友元不是类的成员只是被类 “授权” 的外部对象友元可以是普通全局函数也可以是其他类的成员函数甚至是整个类友元单向性A 是 B 的友元≠ B 是 A 的友元友元不传递A 是 B 的友元B 是 C 的友元≠ A 是 C 的友元。3. 友元的作用场景让两个关联类高效共享数据重载运算符时如、需要访问类的私有成员让工具函数直接操作类的内部数据提升效率。二、友元的三种分类友元分为三类友元全局函数、友元成员函数、友元类。1. 友元全局函数将普通全局函数声明为某个类的友元该函数可直接访问类的私有成员。代码示例#include iostream using namespace std; class Person { // 声明全局函数 showAge 为 Person 类的友元 friend void showAge(Person p); private: int age 20; // 私有成员 }; // 友元全局函数可以直接访问 Person 的私有成员 age void showAge(Person p) { cout 年龄 p.age endl; } int main() { Person p; showAge(p); // 调用友元函数 return 0; }关键点友元声明写在类内部任意位置public/protected/private 都可以函数本身是全局函数不属于类。2. 友元成员函数将另一个类的成员函数声明为友元该成员函数可访问当前类的私有成员。代码示例#include iostream using namespace std; // 提前声明 Person 类 class Person; class Student { public: // 声明为 Person 的友元成员函数 void showPersonAge(Person p); }; class Person { // 声明 Student 的 showPersonAge 为友元 friend void Student::showPersonAge(Person p); private: int age 22; }; // 实现友元成员函数 void Student::showPersonAge(Person p) { cout Person的年龄 p.age endl; } int main() { Person p; Student s; s.showPersonAge(p); return 0; }关键点必须提前声明类否则编译器无法识别只有这一个成员函数有权限不是整个类。3. 友元类将整个类声明为友元该类的所有成员函数都可以访问当前类的私有成员。代码示例#include iostream using namespace std; class Person { // 声明 Student 整个类为友元 friend class Student; private: int age 23; string name 小明; }; class Student { public: // 可以访问 Person 所有私有成员 void show(Person p) { cout 姓名 p.name endl; cout 年龄 p.age endl; } }; int main() { Person p; Student s; s.show(p); return 0; }关键点友元类的所有成员函数都能访问私有成员写法friend class 类名;三、友元的优缺点优点灵活方便快速实现外部访问私有成员效率更高避免频繁调用公有接口函数适配运算符重载如cout 对象必须用友元。缺点破坏封装性类的私有成员不再安全降低代码可维护性外部代码可直接修改内部数据耦合度变高类与类、类与函数关联性太强。四、使用建议能不用就不用优先用公有成员函数访问必须用时再用运算符重载、紧密关联的类最小权限原则优先用友元函数少用友元类。总结友元是friend声明的外部函数 / 类可访问类的私有成员三类友元友元全局函数、友元成员函数、友元类特点单向、不传递、不是类成员优点灵活高效缺点破坏封装谨慎使用。