C++:友元函数介绍

news2024/11/23 2:35:39

上一篇介绍

友元函数 (Friend Function)

友元函数是 C++ 中的一种特殊函数,它可以访问类的私有成员和保护成员,而不需要是该类的成员函数。友元机制允许在不破坏封装的情况下为类提供额外的功能。


友元函数的特点

  1. 访问权限

    • 友元函数可以访问类的所有成员,包括私有成员和保护成员。
    • 友元函数不是类的成员,但被授予了访问私有成员的特权。
  2. 定义方式

    • 在类内通过 friend 关键字声明友元函数。
    • 实际实现可以在类外部完成。
  3. 作用域

    • 友元函数不属于类的作用域,因此不能通过 this 指针访问类实例。
  4. 不受继承影响

    • 友元关系是单向的,且不受继承的影响。例如,如果类 A 是类 B 的友元,B 的派生类并不会自动成为 A 的友元。

友元函数的定义与使用

示例代码
#include <iostream>
using namespace std;

class Box {
private:
    double width;

public:
    // 构造函数
    Box(double w) : width(w) {}

    // 声明友元函数
    friend void printWidth(const Box& b);
};

// 定义友元函数
void printWidth(const Box& b) {
    // 友元函数可以直接访问私有成员
    cout << "Box width: " << b.width << endl;
}

int main() {
    Box box(10.5);
    printWidth(box); // 调用友元函数
    return 0;
}
输出
Box width: 10.5

友元函数的优缺点

优点
  1. 灵活性:可以为非成员函数提供访问类私有成员的能力,增加代码的灵活性。
  2. 扩展性:可以将与类紧密相关的功能封装到独立的函数中,而不强制将其作为类的成员。
缺点
  1. 封装性弱化:友元函数破坏了类的封装性,因为它需要访问类的私有成员。
  2. 维护成本增加:如果滥用友元,代码的耦合度会增加,导致难以维护。

友元函数的用途

  1. 操作符重载

    • 常用于重载运算符(如 <<>>),因为这些操作符不能作为类的成员函数重载。
    #include <iostream>
    using namespace std;
    
    class Complex {
    private:
        double real, imag;
    
    public:
        Complex(double r, double i) : real(r), imag(i) {}
    
        // 声明友元函数用于重载 << 运算符
        friend ostream& operator<<(ostream& out, const Complex& c);
    };
    
    // 定义友元函数
    ostream& operator<<(ostream& out, const Complex& c) {
        out << c.real << " + " << c.imag << "i";
        return out;
    }
    
    int main() {
        Complex c(3.0, 4.5);
        cout << c << endl;
        return 0;
    }
    

    输出

    3 + 4.5i
    
  2. 多个类协作

    • 友元函数可以用于两个类之间的数据共享。例如,两个类的友元函数可以访问各自的私有成员。
    class ClassA;
    class ClassB;
    
    class ClassA {
    private:
        int valueA;
    
    public:
        ClassA(int val) : valueA(val) {}
    
        // 声明友元函数
        friend void showValues(const ClassA& a, const ClassB& b);
    };
    
    class ClassB {
    private:
        int valueB;
    
    public:
        ClassB(int val) : valueB(val) {}
    
        // 声明友元函数
        friend void showValues(const ClassA& a, const ClassB& b);
    };
    
    // 定义友元函数
    void showValues(const ClassA& a, const ClassB& b) {
        cout << "ClassA value: " << a.valueA << ", ClassB value: " << b.valueB << endl;
    }
    
    int main() {
        ClassA a(5);
        ClassB b(10);
        showValues(a, b);
        return 0;
    }
    

    输出

    ClassA value: 5, ClassB value: 10
    

友元函数 vs 普通成员函数

特性友元函数普通成员函数
访问权限可以访问类的私有和保护成员只能访问所属类的成员
是否是类成员不是类成员是类成员
调用方式通过函数名直接调用必须通过类实例调用
this 指针访问没有 this 指针使用 this 指针访问对象

总结

友元函数是一种强大的工具,能够在需要访问类的私有数据时提供便利。然而,使用友元函数时需要谨慎,过度使用可能会破坏类的封装性和增加代码的复杂度。常见的使用场景包括操作符重载和多类协作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java: spire.pdf.free 9.12.3 create pdf

可以用windows 系统中文字体&#xff0c;也可以从文件夹的字体文件 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎* 描述&#xff1a;* # Author : geovindu,Geovin Du 涂…

PSO融合DWA路径规划(附MATLAB源代码)

PSO&#xff08;粒子群优化算法&#xff09;和DWA&#xff08;动态窗口法&#xff09;是路径规划领域常用的两种算法&#xff0c;它们结合使用可以充分发挥各自的优势&#xff0c;实现高效且安全的机器人路径规划。 1. PSO算法的全局路径规划 - 工作原理&#xff1a;PSO模拟群…

双因子认证:统一运维平台安全管理策略

01双因子认证概述 双因子认证&#xff08;Two-Factor Authentication&#xff0c;简称2FA&#xff09;是一种身份验证机制&#xff0c;它要求用户提供两种不同类型的证据来证明自己的身份。这通常包括用户所知道的&#xff08;如密码&#xff09;、用户所拥有的&#xff08;如…

蓝桥杯每日真题 - 第19天

题目&#xff1a;&#xff08;费用报销&#xff09; 题目描述&#xff08;13届 C&C B组F题&#xff09; 解题思路&#xff1a; 1. 问题抽象 本问题可以看作一个限制条件较多的优化问题&#xff0c;核心是如何在金额和时间约束下选择最优方案&#xff1a; 动态规划是理想…

MyBatis实践:提高持久化层数据处理效率

一、MyBatis简介: 1.简介:https://mybatis.org/mybatis-3/zh/index.html?spmwolai.workspace.0.0.66162306mX2SuC MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff…

HTML5实现剪刀石头布小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…

Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~

AI 驱动 3D 动画 大家好&#xff0c;我是石小石&#xff01;随着 Web 技术的发展&#xff0c;Three.js 成为构建 3D 图形和动画的主流工具。与此同时&#xff0c;人工智能&#xff08;AI&#xff09;在图像处理、动作生成等领域表现出强大能力。将 AI 与 Three.js 结合&#x…

如何判断注入点传参类型--理论

注入点传参类型 在我们找到注入点后&#xff0c;首先要判断传参的类型&#xff0c;才能以正确的形式向数据库查询数据。 注入点传参一般分为数字型和字符型。 数字型&#xff1a;当传入的参数为整形时&#xff0c;存在SQL注入漏洞&#xff0c;就可以认为是数字型注入。 字符…

01_初识GeoParquet数据集

概述 GeoParquet是一种用于存储地理空间数据的文件格式&#xff0c;基于Apache Parquet。它支持高效地存储和查询大型地理空间数据集&#xff0c;具有良好的压缩性能和**列式**存储结构。GeoParquet还与许多地理信息系统&#xff08;GIS&#xff09;和大数据处理工具兼容&#…

SAP B1 登陆报错解决方案 - 系统架构目录服务器选择

背景 登录时出现如下报错&#xff0c;报错显示为【系统架构目录服务器选择】 强行登录会发现过往账套都不见了 出现原因 出于各种原因在开机时没有把 SAP 所有的服务成功启动&#xff08;上一次启动科学上网后全局代理没关干净之类的&#xff09;。 解决方案 关机几分钟重启…

037集——JoinEntities连接多段线polyline和圆弧arc(CAD—C#二次开发入门)

如图&#xff1a;最终效果 polyline连接&#xff1a; 代码如下&#xff1a; public void joinentities() {Curve pLine Z.db.SelectEntities<Curve>().First().Clone() as Curve;pLine.ChangeEntityColor(1);Curve pLine1 Z.db.SelectEntities<Curve>().First()…

【划分型 DP-约束划分个数】【hard】【阿里笔试】力扣1278. 分割回文串 III

给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改为其他的小写英文字母。 接着&#xff0c;你需要把 s 分割成 k 个非空且不相交的子串&#xff0c;并且每个子串都是回文串…

如何使用 Vivado 从源码构建 Infinite-ISP FPGA 项目

如约介绍源码构建 Infinite-ISP 项目&#xff0c;其实大家等的是源码&#xff0c;所以中间过程简洁略过&#xff0c;可以直接翻到文末获取链接。 开源ISP&#xff08;Infinite-ISP&#xff09;介绍 构建工程 第一步&#xff0c;从文末或者下面链接获取源码 https://github.com/…

JDK、MAVEN与IDEA的安装与配置

1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境&#xff0c;使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载&#xff1a; MAVEN下载传送…

八股(6)——MySQL(概念相关)

八股&#xff08;6&#xff09;——MySQL&#xff08;概念相关&#xff09; 4.2 MySQLMySQL 基础关系型数据库介绍ACIDMySQL 介绍 MySQL 基础架构MySQL 存储引擎MySQL 存储引擎架构了解吗&#xff1f;MySQL 支持哪些存储引擎&#xff1f;默认使用哪个&#xff1f; MySQL索引什么…

CTF--php伪协议结合Base64绕过

Base64绕过 在ctf中&#xff0c;base64是比较常见的编码方式&#xff0c;在做题的时候发现自己对于base64的编码和解码规则不是很了解&#xff0c;并且恰好碰到了类似的题目&#xff0c;在翻阅了大佬的文章后记录一下&#xff0c;对于base64编码的学习和一个工具 base64编码是…

可视化建模与UML《活动图实验报告》

你当像鸟飞往你的山。 一、实验目的&#xff1a; 1、熟悉活动图的基本功能和使用方法。 2、掌握使用建模工具软件绘制协作图的方法 二、实验环境&#xff1a; window7 | 10 | 11 EA15 三、实验内容&#xff1a; <1>绘制学生选课系统中添加课程(Add Course)用例的活动图…

Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系

参考spring-cloud-alibaba github wiki说明&#xff1a;版本说明 下面截取说明&#xff1a; 2022.x 分支 2021.x 分支 2.2.x 分支 组件版本关系

基于Java Springboot大学校园旧物捐赠网站

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

基于Java Springboot未央商城管理系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xf…