当前位置: 首页 > news >正文

c++ 友元介绍

友元的目的就是让一个函数或类访问另一个函数中的私有成员

友元函数

(1)普通函数作为友元函数

class 类名{friend 函数返回值类型 友元函数名(形参列表);//这个形参一般是此类的对象....
}

经过以上操作后,友元函数就可以访问此类中的私有成员了,下面举个例子

#include <iostream>
using namespace std;
#include <string>
class Person {friend int getMoney(Person& person);
public:string name;
private:int money;
public:Person(string name, int money);
};
Person::Person(string name, int money) {this->name = name;this->money = money;
}
int getMoney(Person &person) {return person.money;
}
int main() {Person person("张三", 10000);cout << getMoney(person) << endl;
}

其中声明了 int getMoney(Person &person)作为友元函数,访问了person类的私有成员money,本例中,通过调用友元函数getMoney访问张三的私有属性money。

普通函数作为友元函数访问了类中的私有成员,且具有修改私有成员的权限

#############################################

(2)其它类的成员函数作为友元函数

其它类中的成员函数作为本类的友元函数时,需要在本类中表明该函数的作用域,并添加友元函数所在类的前向声明,这个要稍微注意一下。

格式:

class B;  //A中的成员函数在类B中作为友元函数,要将B类声明在A类之前
class A{
public:int f();
}
class B{friend int A::f();//声明类A中的成员函数作为友元函数
}

这样A中的f()就可以访问B类中的所有成员,如下示例

class Car;
class Person {
public:string name;
public:Person(string name);void f(Car &car);
};
class Car {friend void Person::f(Car& car);//声明友元函数
public:string name;Car(string name, string keyPassword);
private:string keyPassword;string getkeyPassword();
};
int main() {Car car("大众", "235fkw");Person person("张三");person.f(car);
}

本例中Person类的f()函数在Car类中成为友元函数,f()访问了Car类的私有成员。

跟上面差不多没什么东西,照葫芦画瓢就行了,记住:友元的目的就是让一个函数或类访问另一个函数中的私有成员,再注意下格式就ok了。

#############################################

友元类

友元类可以声明在友元类之后,友元类中的所有成员函数都是该类的友元函数,能够访问该类的所有成员

格式:

class B;
class A{};
classs B{friend class A;
}

示例也差不多,就不制作学术垃圾了。。。

class Car;
class Person {
public:string name;
public:Person(string name);void f(Car &car);
};
class Car {friend class Person;
public:string name;Car(string name, string keyPassword);
private:string keyPassword;string getkeyPassword();
};

最后,使用友元应注意的几个问题

(1)友元声明位置由程序设计者自行决定,且不受类中public,private,protected权限控制符的影响

(2)友元关系是单向的,即类A是类B的友元,但B不是A的友元

(3)友元关系不具有传递性,即类A是类B的友元,类C是类A的友元,但类C不是类A的友元

(4)友元关系不能被继承

相关文章:

c++ 友元介绍

友元的目的就是让一个函数或类访问另一个函数中的私有成员 友元函数 &#xff08;1&#xff09;普通函数作为友元函数 class 类名{friend 函数返回值类型 友元函数名(形参列表);//这个形参一般是此类的对象.... } 经过以上操作后&#xff0c;友元函数就可以访问此类中的私有…...

四维轻云地理空间数据在线管理软件能够在线管理哪些数据?

四维轻云是一款地理空间数据在线管理软件&#xff0c;支持各类地理空间数据的在线管理、浏览及分享&#xff0c;用户可不受时间地点限制&#xff0c;随时随地查看各类地理空间数据。软件还具有项目管理、场景搭建、素材库等功能模块&#xff0c;支持在线协作管理&#xff0c;便…...

学习 GitHub 对我们有什么好处?

学习 GitHub 对我们有什么好处&#xff1f; 为什么要学习 GitHub&#xff0c;或者说学习 GitHub 对我们有什么好处&#xff1f; 理由一&#xff1a;GitHub 上有很多大牛出没&#xff0c;国外的咱先不说&#xff0c;就国内的像百度、腾讯、阿里之类的大公司&#xff0c;里面的很…...

java记录-反射

什么是反射 反射是一种让Java拥有一定动态性的机制&#xff0c;它允许程序在执行期间取得任何类的内部信息&#xff0c;并且直接操作任意对象的内部属性及方法 类加载 类加载后通过堆内存方法区的Class类型对象就能了解该类的结构信息&#xff0c;这个对象就像该类的一面镜子…...

这次彻底不需要账号了,无需魔法永久白嫖GPT

免费GPT 自GPT风靡以来&#xff0c;大家用的是不亦乐乎&#xff0c;你用他去解决过实际问题&#xff0c;你用他去写过代码&#xff0c;你用他去修改过bug&#xff0c;你用他去写过sql&#xff0c;你用他去画过图&#xff0c;你问过他你能想到的任何“刁钻”问题。 你&#xff…...

远程桌面连接是什么?如何开启远程桌面连接详细教程

远程桌面连接是一种非常方便的技术&#xff0c;它允许用户通过互联网在不同的计算机之间共享资源和访问数据。目前这个技术已经广泛地应用于企业、教育、医疗和其他领域&#xff0c;使得人们能够更高效地工作和学习。 这篇文章&#xff0c;我将解释远程桌面连接是什么&#xf…...

lua实战(2)

目录 值和类型子类型类型字符串type (v) 值和类型 Lua是一种动态类型语言。这意味着变量没有类型;只有价值观才有意义。该语言中没有类型定义。所有值都有自己的类型。 Lua中的所有值都是一等值。这意味着所有的值都可以存储在变量中&#xff0c;作为参数传递给其他函数&…...

UI自动化测试案例——简单的Google搜索测试

以下是一个UI自动化测试的经典案例&#xff1a; import unittest from selenium import webdriverclass GoogleSearchTest(unittest.TestCase):def setUp(self):# 创建Chrome浏览器实例self.driver webdriver.Chrome()self.driver.maximize_window() # 最大化浏览器窗口def t…...

C++之虚函数原理

对象数据和函数的存储方式 注意说的是对象。 C中的对象存储方式是 每个对象占用的存储空间只是该对象的数据部分&#xff08;虚函数指针和虚基类指针也属于数据部分&#xff09;&#xff0c;函数属于公共部分。 虚函数表 虚函数是通过虚函数表实现的。 C实现虚函数的方法是…...

Windows Information Protection(WIP)部署方案

目录 前言 一、方案准备工作 1、确定哪些数据需要保护 2、选择合适的加密方式...

细说Hibernate的缓存机制

Hibernate 的缓存机制主要包括一级缓存和二级缓存。 1. 一级缓存&#xff08;Session 缓存&#xff09;&#xff1a; 一级缓存是 Hibernate 的 Session 级别的缓存&#xff0c;与每个 Session 对象相关联。当您通过 Session 对象执行查询、保存或更新操作时&#xff0c;Hibern…...

初识C++之线程库

目录 一、C中的线程使用 二、C的线程安全问题 1. 加锁 2. 变为原子操作 3. 递归里面的锁 4. 定时锁 5. RAII的锁 三、条件变量 1. 为什么需要条件变量 2. 条件变量的使用 2.1 条件变量的相关函数 2.2 wait函数 一、C中的线程使用 线程的概念在linux中的线程栏已经…...

ChatGLM-LLaMA-chinese-insturct 学习记录(含LoRA的源码理解)

ChatGLM-LLaMA-chinese-insturct 前言一、实验记录1.1 环境配置1.2 代码理解1.2.1 LoRA 1.4 实验结果 二、总结 前言 介绍&#xff1a;探索中文instruct数据在ChatGLM, LLaMA等LLM上微调表现&#xff0c;结合PEFT等方法降低资源需求。 Github: https://github.com/27182812/Ch…...

JuiceFS-K8s部署

目录 1、部署JuiceFS-CSI驱动2、创建OBS认证信息Secret3、创建存储类4、创建PVC--PVC创建时会自动创建PV5、创建测试Pod--测试Pod创建容器内是否挂载成功 官网文档地址&#xff1a;https://juicefs.com/docs/zh/csi/introduction/ 1、部署JuiceFS-CSI驱动 部署yaml如下&#x…...

2023最新版本Camtasia电脑录屏软件好不好用?

在当今数字化时代&#xff0c;屏幕录制成为了许多用户制作教学视频、演示文稿、游戏攻略等内容的首选。本文将为您介绍几款常用的电脑录屏软件&#xff0c;包括Camtasia、OBS Studio、Bandicam等&#xff0c;并对其进行功能和用户体验方面的比较&#xff0c;同时给出10款电脑录…...

第三章 Linux 初步

第三章 Linux 初步 一、 基本操作 ①登录&#xff1a; Linux 是多用户系统&#xff0c;必须用正确的用户名和口令登录后才能 进入 Linux Shell 提示符状态。 默认的文本界面 Shell 提示符有两种&#xff1a; •root 用户登录后的提示符&#xff1a; # •普通用户登录后的…...

linux环境安装使用mysql详解

01-安装MySQL并启动 1.1 环境准备 # 1.卸载mariadb&#xff0c;否则安装mysql会出现冲突 &#xff08;1&#xff09;.执行命令rpm -qa | grep mariadb 会列出所有被安装的mariadb rpm 包&#xff1b; &#xff08;2&#xff09;.执行命令rpm -e --nodeps mariadb-libs-5.5.56…...

SUNTANS模型学习(9)——学习Tidal forcing算例

学习Tidal forcing算例 简介网格配置与地形定解条件设置初始条件设置边界条件设置开边界处的通量计算&#xff08;OpenBoundaryFluxes&#xff09;开边处的速度、水位&#xff08;BoundaryVelocities&#xff09; 其它参数配置模拟结果 简介 SUNTANS中 tidal forcing 算例的全…...

​力扣解法汇总1010. 总持续时间可被 60 整除的歌曲

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣 描述&#xff1a; 在歌曲列表中&#xff0c;第 i 首歌曲的持续时间为 time[i] 秒。 返回其总持…...

利用老毛桃pe启动U盘启动ubuntu.iso,完成ubuntu系统的安装

1.双U盘&#xff0c;一个是老毛桃pe启动盘&#xff0c;可以启动grub4dos&#xff0c;加载了run模块&#xff0c;很好用&#xff08;尤其是对不熟悉grub的小白&#xff09; 2.大容量U盘存放ubuntu-desktop-i386.iso&#xff0c;U盘的格式是ntfs格式&#xff08;其实这个不好&am…...

WideResNet深度解析:如何通过宽度优化提升CNN模型效率

1. WideResNet为什么选择"宽度优先"策略 我第一次接触WideResNet是在处理一个医学影像分类项目时。当时用传统的ResNet-152模型&#xff0c;训练一个epoch要将近3小时&#xff0c;显卡都快冒烟了。直到发现了这个"矮胖版"的ResNet&#xff0c;才明白网络设…...

无痛人流三天能出门吗?术后出行与身体恢复科学指南

很多女性在无痛人流术后都会关心出行与恢复问题&#xff0c;其中 “无痛人流三天能出门吗” 是高频咨询内容。术后恢复不仅关系到短期舒适度&#xff0c;也影响生殖系统长期健康。结合临床护理经验与行业康复标准&#xff0c;本文对术后出行时机、注意事项及科学修护方式进行客…...

谷歌发布Gemma 4模型,为低功耗设备带来复杂推理能力

谷歌发布了其最先进的开放权重人工智能模型家族Gemma 4&#xff0c;这标志着开放权重AI模型领域的重大进步。技术架构与性能突破Gemma 4基于与Gemini 3相同的架构基础构建&#xff0c;专门设计用于处理复杂推理任务&#xff0c;并支持在工作站和智能手机等低功耗设备上本地运行…...

编译系统概述

前置知识&#xff1a;硬件-操作系统-用户操作系统是什么&#xff1f;往下描述&#xff0c;操作系统是对硬件控制的封装&#xff0c;往上描述&#xff0c;是管理程序的软件。操作系统主要有这几大部分组成&#xff1a;1.操作系统如何管理CPU&#xff1a;进程、线程、调度和同步机…...

基于MPC模型预测的两轮差速移动机器人多种轨迹跟踪控制(带参考文献)

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

H5动态公共导航栏

CommonNavBar.vue&#xff1a; <template><divclass"common-nav-bar":style"navBarStyle"><!-- 状态栏占位&#xff0c;可以按项目需要删除或调整高度 --><div class"status-bar-placeholder"></div><!-- 主导…...

计算机毕业设计:Python汽车销量智能可视化与预测系统 Flask框架 可视化 机器学习 AI 大模型 大数据(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝50W&#xff0c;前互联网大厂软件研发、集结硕博英豪成立软件开发工作室&#xff0c;专注于计算机相关专业项目实战6年之久&#xff0c;累计开发项目作品上万套。凭借丰富的经验与专业实力&#xff0c;已帮助成千上万的学生顺利毕业&#xff0c;…...

欧洲发布Euro-Office引发OnlyOffice强烈抗议

欧洲企业Ionos和Nextcloud联合推出了Euro-Office&#xff0c;这是基于OnlyOffice云办公套件的分支版本&#xff0c;专为对数字主权有顾虑的组织而设计&#xff0c;此举引发了原开发商的愤怒回应。几天前&#xff0c;以德国自托管云服务商Nextcloud为首的"欧洲企业和社区组…...

Blender场景教程:秘密实验室

BY:Express the Chaos关于我做了5年视觉设计师&#xff0c;但没有正式的3D背景。我十一个月前养成了通过概念艺术和3D表达自己的习惯&#xff0c;不得不向Blender介绍自己&#xff08;因为它是免费软件&#xff0c;我忍不住要用&#xff09;&#xff0c;以及制作3D场景的整个机…...

终极指南:使用android-advancedrecyclerview实现状态保存的拖拽列表

终极指南&#xff1a;使用android-advancedrecyclerview实现状态保存的拖拽列表 【免费下载链接】android-advancedrecyclerview RecyclerView extension library which provides advanced features. (ex. Googles Inbox app like swiping, Play Music app like drag and drop …...