【C++】类和对象之匿名对象友元内部类

news2024/12/22 14:33:37

目录

一、匿名对象

1、基础格式

2、使用场景

二、友元

1、友元函数

2、友元类

三、内部类

1、概念

 2、特性

 四、拷贝对象时的一些编译器优化

1、函数传参

2、对象返回


一、匿名对象

1、基础格式

【注意】

🟢匿名对象的声明周期只有当前行,进入到下一行就会销毁。因此,当我们想一次性调用某       个成员函数时,可以用匿名对象。

🟢匿名对象具有常性,不可以引用。但在引用前加上const就可以了。匿名对象的生命周期         发生改变,跟引用对象的生命周期一样长。

2、使用场景

当需要调用或者返回函数对象但是又不想定义一个函数对象时,就非常适合使用匿名对象。

二、友元

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。 友元分为:友元函数友元类 

1、友元函数

在流插入和流提取重载中已经使用过友元函数。在重载operator<< 时,发现没有办法将operator<< 重载成成员函数,因为count输出流对象和隐含的this指针在抢占第一个参数的位置。this 指针默认是第一个参数也就是左参数,但是实际使用中cout需要是第一个形参对象,才能正常使用。所以要将operator<<重载成全局函数。但又会导致类外没办法访问成员,此时就需要友元来解。operator>>同理。

流插入和流提取重载

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字 

【总结】

🟢友元函数可访问类的私有和保护成员,但不是类的成员函数

🟢友元函数不能用const修饰

🟢友元函数可以在类定义的任何地方声明,不受类访问限定符限制

🟢一个函数可以是多个类的友元函数

🟢友元函数的调用与普通函数的调用原理相同 

2、友元类

 友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。 

【总结】

🟢友元关系是单向的,不具有交换性。

     比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直       接 访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。

🟢友元关系不能传递

     如果C是B的友元, B是A的友元,则不能说明C时A的友元。

🟢友元关系不能继承。 

三、内部类

1、概念

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越 的访问权限。

  内部类就是外部类的友元类 内部类可以通过外部类的对象参数来访 问外部类中的所有成员。但是外部类不是内部类的友元。

 2、特性

🟢内部类可以定义在外部类的public、protected、private都是可以的。

🟢 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。

🟢sizeof(外部类)=外部类,和内部类没有任何关系。

 四、拷贝对象时的一些编译器优化

在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还是非常有用的。

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a)" << endl;
	}
	A(const A& aa)
		:_a(aa._a)
	{
		cout << "A(const A& aa)" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};

1、函数传参

 

【总结】尽量使用 const 和引用传参 。

2、对象返回

【总结】

接受返回值对象,尽量拷贝构造方式接收,不要赋值接收。

函数中返回对象时,尽量返回匿名对象。

 

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

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

相关文章

推荐熊猫电竞赏金电竞系统源码

熊猫电竞赏金电竞系统源码&#xff0c;包含APP、H5和搭建视频教程&#xff0c;支持运营级搭建&#xff0c;这套源码是基于ThinkPHPUniaapp框架开发的。 系统是一套完整的电竞平台开发源码&#xff0c;包括赛事管理、用户系统、竞猜系统、支付系统等模块。源码结构清晰&#xff…

OpenGL排坑指南—贴图纹理绑定和使用

一、前言 在OpenGL学习 的纹理这一章中讲述了纹理贴图的使用方式&#xff0c;主要步骤是先创建一个纹理的对象&#xff0c;和创建顶点VAO类似&#xff0c;然后就开始绑定这个纹理&#xff0c;最后在循环中使用&#xff0c;有时候可能还要用到激活纹理单元的函数。然而&#xff…

【漏洞复现】先锋WEB燃气收费系统文件上传漏洞 1day

漏洞描述 /AjaxService/Upload.aspx 存在任意文件上传漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作…

【算法】增减序列(贪心,差分)

题目 给定一个长度为 n 的数列 a1,a2,…,an&#xff0c;每次可以选择一个区间 [l,r]&#xff0c;使下标在这个区间内的数都加一或者都减一。 求至少需要多少次操作才能使数列中的所有数都一样&#xff0c;并求出在保证最少次数的前提下&#xff0c;最终得到的数列可能有多少种…

如何下载 DEM数字高程数据(SRTM和COPERNICUS)

数字高程模型&#xff08;Digital Elevation Model&#xff0c;DEM&#xff09;是地球表面的数字表示&#xff0c;以地形高程信息的形式存在。DEM通常以栅格或点云的形式存在&#xff0c;其中每个单元&#xff08;栅格或点&#xff09;都具有对应的高程数值。DEM可以使用各种技…

MYSQL篇--锁机制高频面试题

Mysql锁机制 1对mysql的锁有了解吗&#xff1f; 首先我们要知道&#xff0c;mysql的锁 其实是为了解决在并发事务时所导致的数据不一致问题的一种处理机制&#xff0c;也就是说 在事务的隔离级别实现中&#xff0c;就需要利用锁来解决幻读问题 然后我们可以聊到锁的分类 按锁…

Windows安装和使用kafka

一、安装kafka 由于kafka依赖jdk和zookeeper&#xff0c;安装kafka之前需要先安装jdk和zookeeper&#xff0c;也可以使用kafka自带的zookeeper。安装jdk可以参考&#xff1a;Windows和Linux安装jdk&#xff0c;此处使用kafka自带的zookeeper&#xff0c;不单独安装。 下面在Wi…

Python列表(list)

目录 列表列表的创建与删除访问列表元素index() 方法 列表的遍历添加&#xff0c;修改和删除列表元素添加修改删除 对列表统计和计算count() 方法如需确定列表中有**多少元素**&#xff0c;请使用 len() 方法&#xff1a;检查项目是否存在**复制列表****合并两个列表****list()…

Win10安装配置Redis,修改密码

一、下载Redis tporadowski 提供了 支持 Windows平台的 Redis 安装包&#xff0c;目前仍在维护&#xff0c;目前最新版本是 5.0.14&#xff0c;更新速度跟Redis官网也相差好几个大版本。 下载地址&#xff1a;https://github.com/tporadowski/redis/releases 二、Redis 安装 …

极客时间-如何降低用户鉴权的流量压力

背景 内容是极客时间-徐长龙老师的高并发系统实战课的个人学习笔记&#xff0c;欢迎大家学习&#xff01;https://time.geekbang.org/column/article/596644 使用Session方式实现用户的用户鉴权 优点 信息都在服务端储存&#xff0c;对客户端不暴露任何用户敏感的数据信息 缺…

SQL-修改表操作

目录 DDL-表操作-修改 添加字段 &#xff08;方括号内容可选&#xff09; 修改字段 修改指定字段的数据类型 修改字段名和字段类型 删除字段 修改表名 删除表 删除指定表&#xff0c;并重新创建该表 总结 &#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦…

Window平台安装MongoDB

在部署前需要在官网先确定系统对应的Mongo DB版本。 本机电脑为Window10&#xff0c;所以这里以MongoDB 6.0版本。 1 在官网下载安装包 2 安装MongoDB MongoDB Compass 是一个图形界面管理工具&#xff0c;如果勾选了安装会花费长一点时间&#xff0c;可以取消掉勾选&#xff…

[UI5] ODATA V4中的CRUD

文章目录 前言一、Read二、Create三、Update四、Delete 前言 ODATA V4在CRUD方面与V2截然不同。 这篇文章简单介绍V4中是如何进行CRUD操作 一、Read Model不再有read方法&#xff0c; 一般是把Path绑定到View中进行读取&#xff0c; 如果需要额外的读取数据&#xff0c;可使用…

树状结构查询 - 华为OD统一考试

OD统一考试 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 通常使用多行的节点、父节点表示一棵树&#xff0c;比如&#xff1a; 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后&#xff0c;请打印出来树中他的所有下层节点。 …

Python: Spire.PDF-for-Python

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 3.11 # Datetime : 2024/1/11 10:32 # User : geovindu # Product : PyChar…

TypeScript类型挑战:实现内置的Omit实用类型

掌握 TypeScript Omit 泛型&#xff0c;一起完成 Type 挑战&#xff0c;巩固 TypeScript 知识。 为了帮助读者更好地巩固 TypeScript 的知识&#xff0c;我从 Github 上的 type-challenges 库中选择了几十个挑战&#xff0c;与您一起完成类型挑战。 挑战 实现内置的 Omit&…

分布式系统架构设计之分布式消息队列的水平扩展性、安全可用性以及监控与调优

一、分布式消息队列的水平扩展 随着业务的快速发展和数据的不断增长&#xff0c;单一的消息队列服务器往往难以满足高并发、高可用和高吞吐量的需求&#xff0c;因此&#xff0c;如何实现消息队列的水平扩展成为了一个重要的问题。这部分我将从分区、副本、负载均衡等关键概念…

影响eCPM的因素有哪些?如何提升eCPM?

eCPM&#xff08;千次展示有效收益&#xff09;直接关系广告变现收益的高低&#xff0c;是开发者们最关心的数据之一。要想优化提升eCPM&#xff0c;首先要了解哪些主要因素影响eCPM&#xff0c;再针对性优化广告库存&#xff0c;提高变现收益。 https://www.shenshiads.com …

线性回归实例

1、线性回归&#xff08;linear Regression&#xff09;和逻辑回归&#xff08;logistic Regression&#xff09;的区别 线性回归主要是用来拟合数据&#xff0c;逻辑回归主要是用来区分数据&#xff0c;找到决策边界。 线性回归的代价函数常用平方误差函数&#xff0c;逻辑回…

java每日一题——打印100以内个位和十位相同,尾数为1,3,5,7的数字

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;打印100以内个位和十位相同&#xff0c;尾数为1,3,5,7的数字 思路&#xff1a;1&#xff0c;个位通过对10求余数可求出1&#xff0c;3&#xff0c;5&#xff0c;7&#xff1b; 2&#xff0c;十位可通过先除10…