c++类与对象(五):友元、内部类、临时对象、匿名对象
上次重新再次补全了构造函数的内容,以及static成员:C++类与对象(四):再谈构造函数(详解初始化列表)、Static成员
今天就来进行类与对象最后一部分的内容
文章目录
- 1.友元
- 1.1友元函数
- 1.2友元类
- 2.内部类
- 3.临时对象
- 4.匿名对象
1.友元
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以能不用就不用。
友元包括:友元函数和友元类
1.1友元函数
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要在前面加friend关键字
之前我们在重载<< 和>>时已经使用过了,一开始发现重载成成员函数不行。
因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。如果重载为成员函数:this指针默认是第一个参数也就是左操作数了
但是实际使用中cout需要是第一个形参对象,才能正常使用。所以要将operator<<重载成全局函数。但又会导致类外没办法访问成员,此时就需要友元来解决。operator>>同理
class Date
{
public:Date(int year=1, int month = 1, int day = 1):_year(year),_month(month),_day(day){ }friend ostream& operator<<(ostream& out,const Date& d);friend istream& operator>>(istream& in,Date& d);private:int _year;int _month;int _day;
};
ostream& operator<<(ostream& out, const Date& d)
{out << d._year << "/" << d._month << "/" << d._day << endl;return out;
}istream& operator>>(istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}
说明:
- 友元函数可访问类的私有和保护成员,但不是类的成员函数
- 友元函数不能用const修饰
- 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
- 一个函数可以是多个类的友元函数
- 友元函数的调用与普通函数的调用原理相同
1.2友元类
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
友元关系是单向的,不具有交换性。
比如下面Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
友元关系不能传递。如果C是B的友元, B是A的友元,则不能说明C时A的友元。
友元关系不能继承,在继承位置再给大家详细介绍。
class Time
{
public:Time(int hour = 0,int minute=0):_hour(hour),_minute(minute){ }friend class Date;//声明日期类为时间类的友元类,则在日期类中就直接访问Time类//中的私有成员变量
private:int _hour;int _minute;
};class Date
{
public:Date(int year=1, int month = 1, int day = 1):_year(year),_month(month),_day(day){ }void SetTime(int hour = 0, int minute = 0){// 直接访问时间类私有的成员变量_t._hour = hour;_t._minute = minute;}
private:int _year;int _month;int _day;Time _t;
};
2.内部类
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。
- 外部类对内部类没有任何优越的访问权限
- 内部类的构造函数不能直接初始化外部类的对象。如果需要在内部类中使用外部类的对象,应该使用指针或者引用。
class A
{
public:A(int a = 0):_a(a){ }class B//B这个内部类是A的友元{public:void print(A& _ra)//通过引用或者指针{cout << _b << endl;cout << _ra._a << endl;//访问外部类的私有变量}private:int _b;};
private:int _a;
};
其实B就是一个普通类,只是受A的类域和访问限定符限制,本质相当于被封装了一下
特性:
- 内部类可以定义在外部类的public、protected、private都是可以的。
- 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
- sizeof(外部类)=外部类,和内部类没有任何关系
3.临时对象
临时对象是指在表达式中创建的、没有被显式命名的对象。它们通常用于在表达式中进行一些计算或操作,然后被立即销毁。临时对象的生命周期通常只存在于当前表达式的执行过程中。
临时对象的使用场景包括:
- 作为函数的实参传递给函数。
- 作为函数的返回值返回给调用者。
- 用于执行一些临时的计算或操作
class Point {
public:Point(int x, int y) : _x(x), _y(y) {cout << "Constructor called" << endl;}Point(const Point& other) : _x(other._x), _y(other._y) {cout << "Copy constructor called" << endl;}~Point() {cout << "Destructor called" << endl;}void Print() {cout << "Point(" << _x << ", " << _y << ")" << endl;}
private:int _x;int _y;
};Point CreatePoint()
{return Point(3, 4); // 创建临时对象并返回
}int main()
{Point p1 = CreatePoint(); // 临时对象作为返回值赋值给p1后就开始销毁了p1.Print();return 0;
}
结果:
Constructor called
Copy constructor called
Destructor called
Point(3, 4)
Destructor called
4.匿名对象
匿名对象是在创建时未命名的临时对象。它们没有被显式地分配给任何变量,只在创建时使用,通常用于简单操作、函数调用或者作为表达式的一部分
class A
{
public:A()//无参构造{count++;}A(A& a)//拷贝构造{count++;}static int getCount()//静态成员函数,没有this指针{return count;}
private:static int count;//类内声明,属于整体(公有)
};
int A::count = 0;//类外定义int main()
{A aa; //A aa;有名对象cout << aa.getCount()-1 << endl;A();// 这种写法叫做匿名对象,生命周期只在这一行。方便调用函数用的cout << A().getCount() - 1 << endl;return 0;
}
c++初阶类与对象的基本内容就已经梳理好了,感谢大家的支持!!!
相关文章:
c++类与对象(五):友元、内部类、临时对象、匿名对象
上次重新再次补全了构造函数的内容,以及static成员:C类与对象(四):再谈构造函数(详解初始化列表)、Static成员 今天就来进行类与对象最后一部分的内容 文章目录 1.友元1.1友元函数1.2友元类 2.内…...
细数语音识别中的几个former
随着Transformer在人工智能领域掀起了一轮技术革命,越来越多的领域开始使用基于Transformer的网络结构。目前在语音识别领域中,Tranformer已经取代了传统ASR建模方式。近几年关于ASR的研究工作很多都是基于Transformer的改进,本文将介绍其中应…...
【MySQL进阶】锁
文章目录 锁概述全局锁语法特点 表级锁表锁意向锁 行级锁行锁间隙锁&临键锁 面试了解数据库的锁吗?介绍一下间隙锁InnoDB中行级锁是怎么实现的?数据库在什么情况下会发生死锁?说说数据库死锁的解决办法 锁 概述 锁机制:数据库…...
redis复制和分区:主从复制、哨兵模式和集群模式
概述 在 Redis 中,复制和分区是用于数据冗余和性能扩展的关键特性。以下是主从复制、哨兵模式和集群模式的工作原理的简要概述: 主从复制 (Replication) 基本概念:Redis 的主从复制功能允许多个 Redis 服务器具有相同的数据副本。这在读取操…...
个人实现的QT拼图游戏(开源),QT拖拽事件详解
文章目录 效果图引言玩法 拖拽概念基本概念如何在Qt中使用拖放注意事项 游戏关键问题总结 效果图 // 多种响应方式 func main() {// 1.创建路由// 默认使用了2个中…...
第三方控价服务商怎么选
用对了方法,事半功倍,品牌控价也是如此,品牌方在治理工作中,如果选择自建团队进行处理,需要包含对数据技术的抓取团队,还要有对治理规则熟悉的操作团队,涉及人员和系统,费用成本相应…...
大模型的学习路线图推荐—多维度深度分析【云驻共创】
🐲本文背景 近年来,随着深度学习技术的迅猛发展,大模型已经成为学术界和工业界的热门话题。大模型具有数亿到数十亿的参数,这使得它们在处理复杂任务时表现得更为出色,但同时也对计算资源和数据量提出了更高的要求。 …...
【学习】focal loss 损失函数
focal loss用于解决正负样本的不均衡情况 通常我们需要预测的正样本要少于负样本,正负样本分布不均衡会带来什么影响?主要是两个方面。 样本不均衡的话,训练是低效不充分的。因为困难的正样本数量较少,大部分时间都在学习没有用…...
几个好玩好用的AI站点
本文作者系360奇舞团前端开发工程师 ai能力在去年一年飞速增长,各种AI产品如雨后春笋般冒出来,在各种垂直领域上似乎都有AI的身影出现,今天就总结几款好玩的场景,看大家工作生活中是否会用到。 先说一个比较重要的消息是ÿ…...
Java算法 leetcode简单刷题记录5
Java算法 leetcode简单刷题记录5 老人的数目: https://leetcode.cn/problems/number-of-senior-citizens/ substring(a,b) 前闭后开 统计能整除数字的位数: https://leetcode.cn/problems/count-the-digits-that-divide-a-number/ 并不复杂,…...
计算机网络自顶向下Wireshark labs1-Intro
Wireshark labs1 实验文档:http://www-net.cs.umass.edu/wireshark-labs/Wireshark_Intro_v8.0.pdf 介绍 加深对网络协议的理解通常可以通过观察协议的运行和不断调试协议来大大加深,具体而言,就是观察两个协议实体之间交换的报文序列&…...
CSS实现图片放大缩小的几种方法
参考 方法一: 常用使用img标签,制定width或者height的任意一个,图片会自动等比例缩小 <div><img src"https://avatar.csdn.net/8/5/D/1_u012941315.jpg"/> </div> <!-- CSS--> <style> img {widt…...
时间序列预测 — CNN-LSTM-Attention实现多变量负荷预测(Tensorflow):多变量滚动
专栏链接:https://blog.csdn.net/qq_41921826/category_12495091.html 专栏内容 所有文章提供源代码、数据集、效果可视化 文章多次上领域内容榜、每日必看榜单、全站综合热榜 时间序列预测存在的问题 现有的大量方法没有真正的预测未…...
angular-tree-component组件中实现特定节点自动展开
核心API 都在 expandToNode这个函数中 HTML treeData的数据结构大概如下 [{"key": "3293040275","id": "law_category/3293040275","name": "嘿嘿嘿嘿","rank": 0,"parentKey": "0&q…...
Linux系统下安装Vcpkg,并使用Vcpkg安装、编译OpenSceneGraph
环境:CentOS7 内存:8g(内存过少编译osg时会出现内存不足导致编译失败的情况,内存设置为4G时失败了,我直接加到了8g,所以就以8g为准了) 安装和配置vcpkg cd ~/ git clone https://www.github.com/microsoft/vcpkg cd …...
设计模式二(工厂模式)
本质:实例化对象不用new,用工厂代替,实现了创建者和调用者分离 满足: 开闭原则:对拓展开放,对修改关闭 依赖倒置原则:要针对接口编程 迪米特原则:最少了解原则,只与自己直…...
Maven应用手册
没加载出来就reimport,这个时候clean和install没用,那是编译安装项目的。 reimport干了什么? 结合idea的maven教程 父子模块 子模块不需要groupId ruoyi中父模块还添加了子模块的依赖,,, 先安装父再是子…...
笨蛋学设计模式行为型模式-状态模式【20】
行为型模式-状态模式 8.7状态模式8.7.1概念8.7.2场景8.7.3优势 / 劣势8.7.4状态模式可分为8.7.5状态模式8.7.6实战8.7.6.1题目描述8.7.6.2输入描述8.7.6.3输出描述8.7.6.4代码 8.7.7总结 8.7状态模式 8.7.1概念 状态模式是指对象在运行时可以根据内部状态的不同而改变它们…...
C++从零开始的打怪升级之路(day18)
这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector的题目 1.只出现一次的数字1 136. 只出…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
