类与对象\友元

  • 最前面加上关键字 friend
  • 友元是单向的,不具有交换性
    • 实现互访需要两个类都将对方声明为自己的友元类
  • 友元关系不具备传递性
  • 使用友元可以避免频繁调用类的接口函数,提高效率,节省开销

3种形式

  • 友元函数:不属于任何类的普通函数
  • 友元成员:其他类的成员函数
  • 友元类:另一个类

友元函数

  • 通常友元函数是在类的定义中给出原型声明,声明位置不受访问属性限制
    • 不同的属性但结果一样的

友元成员

  • 向前声明
    • 仅是类型说明符
    • 只能用于定义引用和指针
    • 不能用于定义对象

代码示例

#include<iostream>
#include<iomanip>
using namespace std;class Score;class Croster
{
private:string name;
public:Croster(string na = "undef");void PrintReport(const Score& s)const;
};class Score
{
private:int math, english;double GPA;
public:Score(int x = 0, int y = 0);friend void Croster::PrintReport(const Score& s)const;
};Croster::Croster(string na) :name(na)
{}Score::Score(int x, int y) :math(x), english(y)
{GPA = (math + english) / 200.0 * 5;
}void Croster::PrintReport(const Score& s) const
{cout << "Name: " << name << endl;cout << "GPA: " << setprecision(2) << s.GPA << endl;cout << "Math: " << s.math << endl;cout << "English: " << s.english << endl;
}int main()
{int i;Croster stu[3] = { Croster("Alice"), Croster("Bob"), Croster("Charlie") };Score s[3] = { Score(90, 80), Score(85, 95), Score(70, 80) };for (i = 0; i < 3; i++)stu[i].PrintReport(s[i]);return 0;
}

友元类

  • 若 A 被声明为 B 的友元
    • A 中的所有成员函数都是 B 类的友元成员,都可以访问 B 类的所有成员

代码示例

#include<iostream>
#include<iomanip>
using namespace std;class Croster;	//向前声明
class CDate
{
private:int Date_year, Date_month, Date_day;
public:CDate(int y=2000, int m=1, int d=1);friend Croster;
};class Croster
{
private:string name;double GPA;
public:Croster(string n="undef", double G=3);void PrintInfo(const CDate& date) const;
};Croster::Croster(string n, double G):name(n), GPA(G)
{}void Croster::PrintInfo(const CDate &date) const
{cout << "Name: " << name << endl;cout << "GPA: " << fixed << setprecision(2) << GPA << endl;cout << "Date: " << date.Date_year << "-" << date.Date_month << "-" << date.Date_day << endl;
}CDate::CDate(int y, int m, int d):Date_year(y), Date_month(m), Date_day(d)
{}int main()
{Croster stu("Tom", 3.8);CDate date(2019, 12, 10);stu.PrintInfo(date);return 0;
}

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

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

相关文章

SpringBoot项目在yml或者properties文件中使用环境变量

在 application.yml 或者 application.properties 值的位置随便写这样的语法就可以替换文本 ${MYSQL_URL:192.168.0.100}比如 datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://${MYSQL_URL:192.168.0.10…

​智己舆论战完败

阅读本文大概需要 1.41 分钟 智己汽车跟小米汽车双方在社交媒体上的交锋&#xff0c;想必大家这两天应该有所耳闻&#xff0c;具体情况是这样的&#xff1a;智己发布新车 L6&#xff0c;对标小米 SU7&#xff0c;其中有一项对小米 SU7 的参数标注错误。于是小米发文要求其道歉&…

cmd输出日期及格式

编写Windows批处理时经常会需要使用到日期和时间作为文件名&#xff0c;详解如下&#xff1a; 1.获取日期 格式&#xff1a; %date% 结果&#xff1a; 2022-07-31 2.获取时间 格式&#xff1a; %time% 结果&#xff1a; 10:21:21.68 3.获取日期和时间 格式&#xff1a;…

grid布局不确定x轴或者y轴具体有多少行,但是宽高是固定的

在CSS Grid布局中&#xff0c;即使你不确定x轴&#xff08;列&#xff09;或y轴&#xff08;行&#xff09;上具体有多少元素&#xff0c;你仍然可以通过设置固定的宽度和高度来定义网格。如果你想要创建一个固定宽高的网格&#xff0c;但不确定具体的行数或列数&#xff0c;你…

huggingface无法下载模型的问题解决

OpenDevin里面的embedding模型需要从huggingface下载&#xff0c;但是连不上&#xff0c;怎么办呢&#xff1f; 以前碰到连不上&#xff0c;就放弃了&#xff0c;所以很长时间没有用过huggingface。这回OpenDevin这个软件太牛了&#xff0c;激励着我把这个这个问题解决。 从网…

从零开始学Spring Boot系列-SpringApplication

SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下&#xff0c; 你只需委托给 SpringApplication.run这个静态方法 &#xff1a; SpringBootApplicationpublic class SpringbootLearningApplication {public static void main(String[] args) …

【MYSQL锁】透彻地理解MYSQL锁

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …

HTTP与HTTPS:深度解析两种网络协议的工作原理、安全机制、性能影响与现代Web应用中的重要角色

HTTP (HyperText Transfer Protocol) 和 HTTPS (Hypertext Transfer Protocol Secure) 是互联网通信中不可或缺的两种协议&#xff0c;它们共同支撑了全球范围内的Web内容传输与交互。本文将深度解析HTTP与HTTPS的工作原理、安全机制、性能影响&#xff0c;并探讨它们在现代Web…

docker重启错误-重启命令一直卡住

docker重启错误-重启命令一直卡住 systemctl restart docker 卡住 未知原因&#xff1a;可能是启动的容器数量过多&#xff0c;或者磁盘IO问题 解决方式&#xff1a; systemctl start docker-cleanup.service systemctl start docker Docker是一种相对使用较简单的容器&#…

蓝桥杯每日一题:扫雷(Flood Fill)

题目描述&#xff1a; 扫雷是一种计算机游戏&#xff0c;在 2020 世纪 8080 年代开始流行&#xff0c;并且仍然包含在某些版本的 Microsoft Windows 操作系统中。 在这个问题中&#xff0c;你正在一个矩形网格上玩扫雷游戏。 最初网格内的所有单元格都呈未打开状态。 其中 …

Linux第87步_阻塞IO实验

阻塞IO是“应用程序”对“驱动设备”进行操作&#xff0c;若不能获取到设备资源&#xff0c;则阻塞IO应用程序的线程会被“挂起”&#xff0c;直到获取到设备资源为止。 “挂起”就是让线程进入休眠&#xff0c;将CPU的资源让出来。线程进入休眠后&#xff0c;当设备文件可以操…

基于java+springboot+vue实现的图书管理系统(文末源码+Lw)23-259

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;图书信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

数据结构之查找的总结

一、线性表的查找 ①、顺序查找之二分查找 int BinSearch(RecType R[], int n, KeyType k) {int low 0, high n - 1, mid;while(low < high){mid (low high) / 2;if(k R[mid].key)return mid 1;if(k < R[mid].key)high mid - 1;elselow mid 1;} return 0; }

嵌入式ARM版本银河麒麟操作系统V10SP1安装OPenGauss数据库

前言&#xff1a; 官网提供了非常完整的openGauss安装步骤。 https://opengauss.org/zh/download/archive/列举一下个人的使用环境&#xff1a; 麒麟V10 rk3588工控板&#xff08;ARM&#xff09; openGauss-3.0.5&#xff08;极简版&#xff09;浏览一下官网&#xff0c;可以…

JavaScript核心语法及数据类型详解

JavaScript是一种广泛应用于Web开发的脚本语言&#xff0c;它具有丰富的核心语法和数据类型。本文将重点回顾JavaScript的核心语法和数据类型。 JavaScript的核心语法 变量声明和赋值 在JavaScript中&#xff0c;可以使用var、let、const关键字来声明变量。 var是ES5中的变…

一网统管/安防监控/视频综合管理EasyCVR视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&a…

代码随想录--数组--二分查找

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 举一个字符数组的例子&#xff0c;如图所示&#xff1a; 需要两点注意的是 数组下标都是从0开始的。 数组内存空间的地址是连续的。 正是因为数…

第十一届 蓝桥杯 单片机设计与开发项目 省赛

第十一届 蓝桥杯 单片机设计与开发项目 省赛 01 核心框架&#xff08;多界面显示&#xff0c;界面切换&#xff0c;参数设置&#xff09; bit Seg_Disp_Mode;//0-数据界面 1-参数界面 float Temperature; unsigned char Temp_Disp[2]; unsigned char Temp_Disp_Ctrol[2] {30,…

【vue】watch监听取不到this指向的数?

今天同事问我&#xff0c;watch里this指向的数值&#xff0c;别的地方却可以打印出来。工具也能看到数值&#xff0c;但打印出来却是undifined&#xff0c;先看看代码&#xff1a; 懒得打字了直接上截图吧 ps&#xff1a; 在Vue组件中&#xff0c;如果你在watch选项中访问this…

【Web2D/3D】WebGL和ThreeJS自学资料推荐

1. 前言 随着Web引入OpenGL&#xff08;WebGL&#xff09;&#xff0c;拓展了Web在可视化领域运用&#xff0c;尤其是促进3D领域的技术在Web前端的发展。而ThreeJS是基于WebGL做的上层封装&#xff0c;为开发者屏蔽空间几何的计算细节。当然为了学好WebGL/ThreeJS&#xff0c;计…