### C++友元函数及友元类全总结 #### 一、引言 在C++编程语言中,封装性是一个非常重要的概念。封装使得对象的数据成员(尤其是私有成员)和成员函数得以隐藏,从而提高了代码的安全性和可维护性。然而,在某些场景下,我们可能需要让一个外部函数或者另一个类的成员函数访问一个类的私有成员。这时就需要用到友元(Friend)的概念。本文将详细介绍C++中的友元函数和友元类,以及它们的使用方法和注意事项。 #### 二、友元函数 **1. 为什么引入友元函数** 在C++中,当需要实现类之间的数据共享时,传统的做法是通过设置公共成员函数来访问私有成员。这种做法虽然安全,但在某些情况下可能会带来额外的系统开销。例如,当我们需要实现运算符重载功能时,往往需要用到友元函数,这样可以简化代码并提高程序效率。 **2. 何时使用友元函数** - **运算符重载**:在实现某些特定运算符重载时,如重载`+`、`-`等操作符时,需要访问操作数的私有成员,这时可以使用友元函数。 - **类间数据共享**:当两个类需要共享数据时,可以通过定义友元函数来实现对私有成员的访问。 **3. 如何使用友元函数** 友元函数是在类外定义的函数,但它可以访问该类的所有私有和保护成员。友元函数的声明需要在类中进行,并且需要使用`friend`关键字。下面是一些关于友元函数的关键点: - **友元函数的参数**:由于友元函数没有`this`指针,因此当需要访问非静态成员时,通常需要传入对象作为参数。 - **友元函数的位置**:友元函数的声明可以放在类的私有部分或公有部分,这不会影响其作用。 - **友元函数的调用**:友元函数可以直接调用,不需要通过对象或指针。 - **友元函数的分类**:根据友元函数的来源,可以将其分为三类: - **普通函数友元**:允许一个普通函数访问类的私有成员。 - **友元类**:指定一个类的所有成员函数都是另一个类的友元。 - **特定成员函数友元**:指定某个类的一个成员函数是另一个类的友元。 #### 三、普通函数友元 **1. 目的** 普通函数友元的主要目的是允许一个非成员函数访问类的私有成员。 **2. 语法** - **声明**:`friend <返回类型> <函数名>(<参数列表>);` - **实现**:在类外定义普通函数,无需使用`friend`和类名前缀。 **3. 示例** ```cpp class INTEGER { private: int num; public: friend void Print(const INTEGER& obj); }; void Print(const INTEGER& obj) { // 函数体 } int main() { INTEGER obj; Print(obj); } ``` #### 四、友元类 **1. 目的** 友元类的目的在于允许一个类的所有成员函数访问另一个类的所有私有和保护成员。 **2. 语法** - **声明**:`friend class <类名>;` - **实现**:在友元类的成员函数中直接访问被声明为友元的那个类的私有成员。 **3. 示例** ```cpp class girl; class boy { private: char *name; int age; public: boy(); void disp(girl&); }; class girl { private: char *name; int age; public: friend class boy; girl(); }; void boy::disp(girl& x) { cout << "boy's name is: " << name << ", age: " << age << endl; cout << "girl's name is: " << x.name << ", age: " << x.age << endl; } int main() { boy b; girl g; b.disp(g); } ``` #### 五、特定成员函数友元 **1. 目的** 特定成员函数友元是指允许一个类的某个成员函数访问另一个类的私有成员。 **2. 语法** - **声明**:`friend <返回类型> <类名>::<成员函数名>(<参数列表>);` - **实现**:在类内声明特定成员函数为友元。 **3. 示例** ```cpp class girl; class boy { private: char *name; int age; public: boy(); void disp(girl&); }; class girl { private: char *name; int age; public: friend void boy::disp(girl&); girl(); }; void boy::disp(girl& x) { cout << "boy's name is: " << name << ", age: " << age << endl; cout << "girl's name is: " << x.name << ", age: " << x.age << endl; } int main() { boy b; girl g; b.disp(g); } ``` #### 六、注意事项 - **破坏封装性**:友元函数会破坏封装性,因为它允许非成员函数访问类的私有成员。在设计时应尽量避免滥用友元函数。 - **仅限必要时使用**:只有在确实需要访问类的私有成员时才考虑使用友元函数。 #### 七、总结 友元函数和友元类是C++中用于实现类间数据共享的重要机制。它们能够简化代码,提高程序效率。但需要注意的是,过度使用友元会导致封装性的破坏,从而降低代码的安全性和可维护性。因此,在实际编程过程中应当谨慎使用友元机制。

















- 粉丝: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 操作系统课程设计 键盘驱动.doc
- ArcGIS解决方案与超图的对比.doc
- 大数据数据挖掘培训讲义偏差检测.ppt
- 餐饮行业网络营销策略ppt课件.ppt
- IPMP培训之二(项目组织与团队).pptx
- 2023年计算机个重要知识点总结必备考试密押题.doc
- java程序员辞职报告五篇.doc
- 工程总承包项目信息化管理技术研究的开题报告.docx
- PLC基础知识大全.ppt
- OSEK操作系统.pptx
- 毕业设计基于WEB的的固定资产管理系统的设计与实现终稿精品.doc
- 网站型教学资源的建设.doc
- 人工智能在金融交易中的作用及未来的发展方向.docx
- 【管理类】《中国网址》项目管理方案.doc
- 基因工程菌E.coli的热动力学研究的开题报告.docx
- 龙戈小额贷款管理系统产品简介-南京龙戈软件教学幻灯片.ppt


