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

C++ 类和对象下 [补充]

文章目录

    • 友元
    • 内部类
      • 内部类是外部类的天生友元
    • 匿名对象
      • 匿名对象的特性
    • 拷贝对象时的一些编译器优化
      • 函数返回值临时空间的存储位置
      • 返回值临时空间具有常性
    • 标题相同和不同类型 需要 临时空间

友元

  1. 友元函数
    重载operator<< 输出自定义类型
    比如日期类的这个重载,就是解决类外访问私有变量的例子,设计成了友元函数。
    说明:
    友元函数可访问类的私有和保护成员,但不是类的成员函数
    友元函数不能用const修饰 (没有this指针,无法修饰)

  2. 友元类

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

class Time
{friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成
员变量
public:Time(int hour = 0, int minute = 0, int second = 0): _hour(hour), _minute(minute), _second(second){}private:int _hour;int _minute;int _second;
};
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接访问时间类私有的成员变量_t._hour = hour;_t._minute = minute;_t._second = second;}private:int _year;int _month;int _day;Time _t;
};

内部类

概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类

  1. 问题:sizeof(A) = ?

在这里插入图片描述
回答:sizeof( A ) = 4
因为B在A的内部,其实他们之间没什么关系,只不过是B这个类型定义在A的类域里,没有B的实例化对象不占空间,类是图纸,如果A的成员变量里面 有个 B的实例化对象,那就占空间了。
static int k; 在静态区里,也不占空间。

class B 受访问限定符的控制,你可以公开权限,突破A类域生成B对象,如果是私有权限那么创建不了B对象
在这里插入图片描述
形象化:就是A是一个建筑图纸,那么B就是A图纸里面附赠的一份图纸

内部类是外部类的天生友元

在这里插入图片描述

匿名对象

例子1
在这里插入图片描述

A() 也可以这么写

例子2
在这里插入图片描述
这里面Solution().Sum_Solution(20)
我看了一开始也觉得奇怪,但是如果不加只剩类型,Solution.Sum_Solution(20)肯定无法调用
所以要加括号表明 是匿名对象

错误写法(不加括号):

在这里插入图片描述

这里又回溯回之前 类创建对象时为什么不加括号的问题:
原因:默认构造初始化对象 不能写成 Solution s1();的原因是 无法区分是函数还是初始化对象

在这里插入图片描述

匿名对象的特性

匿名对象生命周期在当前行
用引用强行续命,延长了生命周期在当前局部域
匿名对象具有常性(和临时空间一样具有常性)
在这里插入图片描述

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

不同编译器对连续构造的优化不同, Linux下优化可能更加极致

拷贝构造+拷贝构造 ->优化为拷贝构造

构造+拷贝构造 ->优化为构造

如图看到连续的构造尽量写到一行,避免分开写更麻烦同时也干扰了编译器优化,导致效率变低(没有写成一行导致没有优化)
在这里插入图片描述

函数返回值临时空间的存储位置

函数传值返回,如果返回的对象很大,那么它所保存在的临时空间是在哪里呢? 答:返回对象时内置类型时,一般都是通过寄存器来带回返回值的,返回对象如果时较大的对象时,一般会在主调函数的栈帧中开辟一块空间,然后把这块空间的地址,隐式传递给被调函数,在被调函数中通过地址找到主调函数中预留的空间,将返回值直接保存到主调函数的。 具体可以参考《程序员的自我修养》一书的第10章。

在这里插入图片描述
知道了保存在了主调函数,也就是main函数里,那么可以解释一下析构的顺序:
按理说在一个函数内创建对象 是符合栈规则后进先出,但是这个情况是临时空间先入的栈,只不过是后拷贝构造,Func3()里的A aa其实在栈中临时空间的上面(函数栈帧中把栈倒了过来向上增长,其实实际是向下增长),那么自然就是先析构A aa,后再析构临时空间
在这里插入图片描述

返回值临时空间具有常性

const A&  ra  = Func5();

既然临时空间保存在了主调函数,加了const是临时空间具有常性。生命周期也在局部范围,如果没有使用这块临时空间它也会在这一行结束生命,也算是一种续命了。
在这里插入图片描述

标题相同和不同类型 需要 临时空间

http://www.lryc.cn/news/69346.html

相关文章:

  • [CTF/网络安全] 攻防世界 PHP2 解题详析
  • 图神经网络:(节点分类)在Cora数据集上动手实现图神经网络
  • RabbitMQ应用问题——消息补偿机制以及代码示例
  • 量化特征贡献度函数:feature_importances_函数/LGBMClassifier/XGBClassifier
  • 总结JVM重要知识点
  • 奇技淫巧第8期
  • 这个 归并排序详解过程 我能吹一辈子!!!
  • docker版jxTMS使用指南:自动生成代码
  • 聚观早报 | 小冰启动GPT克隆人计划;ofo创始人在美创业改做咖啡
  • 面试造航母,入职拧螺丝,工资离了个大谱...
  • Python+selenium自动化元素定位防踩坑
  • 【计算机组成原理】实验一
  • 前端022_广告模块_修改功能
  • makefile 学习(3):C++的编译及库文件的生成与链接
  • Ceph crush运行图
  • 【分布族谱】泊松分布和二项分布、正态分布的关系
  • 关于QTreeWidget的setData函数
  • Microsoft Office 2003的安装
  • 使用Spring Boot和Spring Cloud实现多租户架构:支持应用多租户部署和管理
  • 智聚北京!相约全球人力资源数智化峰会
  • 工业缺陷检测数据及代码(附代码)
  • CentOS 安装MongoDB 6.0
  • 美团面试,被拷打了一小时....
  • 017+C语言中函数栈帧的创建与销毁(VS2022环境)
  • 马斯克们叫停 GPT-5,更像是场行为艺术
  • 事务基础知识
  • 国产高性能DSP音频处理芯片的工作原理以及应用领域
  • BEVDet4D 论文学习
  • 【设计模式与范式:创建型】43 | 单例模式(下):如何设计实现一个集群环境下的分布式单例模式?
  • Metal入门学习:绘制渲染三角形