【C++】8.类和对象(6)

文章目录

  • 5. 内部类
  • 6. 匿名对象
  • 7. 对象拷贝时的编译器优化


5. 内部类

  • 如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。

  • 内部类默认是外部类的友元类。

  • 内部类本质也是一种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使用,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了。

class A
{
private:static int _k;//静态成员变量存储在静态区里面,所以计算大小的时候不会被计算int _h = 1;//4字节public:class B // B默认就是A的友元{public:void foo(const A& a){cout << _k << endl; //OKcout << a._h << endl; //OK}private:int _b;};
};int A::_k = 1;int main()
{cout << sizeof(A) << endl;A::B b;return 0;
}

打印:

4

打印4说明只需要计算int _h = 1;是4字节,不需要计算B

这说明A对象里面没有B对象。

AB的关系其实就像下面一样,AABB

B定义到A里面是说B受到A这个类域的限制。

class A
{
private:static int _k;//静态成员变量存储在静态区里面,所以计算大小的时候不会被计算int _h = 1;
public:
};class B // B默认就是A的友元
{
public:void foo(const A& a){cout << _k << endl; //OKcout << a._h << endl; //OK}
private:int _b;
};int A::_k = 1;int main()
{cout << sizeof(A) << endl;A::B b;return 0;
}

当然,如果把B类放到A类的private里面,那么就无法通过A::B b;来访问了。

class A
{
private:static int _k;//静态成员变量存储在静态区里面,所以计算大小的时候不会被计算int _h = 1;//4字节class B // B默认就是A的友元{public:void foo(const A& a){cout << _k << endl; //OKcout << a._h << endl; //OK}private:int _b;};
};int A::_k = 1;int main()
{cout << sizeof(A) << endl;A::B b;//会报错return 0;
}

学完内部类后我们也可以这么写之前的那题:

4f69881563edf4761810f245997b7a8d

代码:

class Solution {// 内部类class Sum{public:Sum(){_ret += _i;++_i;}};static int _i;static int _ret;
public:int Sum_Solution(int n) {// 变长数组Sum arr[n];return _ret;}
};
int Solution::_i = 1;
int Solution::_ret = 0;

6. 匿名对象

  • 用类型(实参) 定义出来的对象叫做匿名对象,相比之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象

  • 匿名对象生命周期只在当前一行,一般临时定义一个对象当前用一下即可,就可以定义匿名对象。

class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};class Solution {
public:int Sum_Solution(int n) {//...return n;}
};int main()
{A aa1;//有名对象(有名字的对象)//A aa1();// 有名对象不能这么定义对象,因为编译器无法识别下面是一个函数声明,还是对象定义// 但是我们可以这么定义匿名对象,匿名对象的特点不用取名字,// 但是他的生命周期只有这一行,我们可以看到下一行他就会自动调用析构函数A();A(1);A aa2(2);//原本我们这样调用对象的Solution s1;cout << s1.Sum_Solution(10) << endl;// 匿名对象在这样场景下就很好用,当然还有一些其他使用场景,这个我们以后遇到了再说cout << Solution().Sum_Solution(10) << endl;return 0;
}
class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};void func(A aa = A(1))//缺省参数一般是给常量和自定义变量,现在可以给个匿名对象了
{}int main()
{func();const A& r = A();//匿名对象可以引用,但是匿名对象和临时对象一样有常性。不过const引用会延长他的生命周期。return 0;
}

7. 对象拷贝时的编译器优化

  • 现代编译器会为了尽可能提高程序的效率,在不影响正确性的情况下会尽可能减少一些传参和传返回值的过程中可以省略的拷贝。

  • 如何优化C++标准并没有严格规定,各个编译器会根据情况自行处理。当前主流的相对新一点的编译器对于连续一个表达式步骤中的连续拷贝会进行合并优化,有些更新更"激进"的编译器还会进行跨行跨表达式的合并优化。

#include<iostream>
using namespace std;
class A
{
public:A(int a = 0):_a1(a){cout << "A(int a)" << endl;}A(const A& aa):_a1(aa._a1){cout << "A(const A& aa)" << endl;}A& operator=(const A& aa){cout << "A& operator=(const A& aa)" << endl;if (this != &aa){_a1 = aa._a1;}return *this;}~A(){cout << "~A()" << endl;}
private:int _a1 = 1;
};void f1(A aa)
{}A f2()
{A aa;return aa;
}int main()
{// 优化A aa0 = 1;cout << endl;// 传值传参A aa1;f1(aa1);cout << endl;// 隐式类型,连续构造+拷贝构造->优化为直接构造f1(1);// 一个表达式中,连续构造+拷贝构造->优化为一个构造f1(A(2));cout << endl;cout << "***********************************************" << endl;// 传值返回// 返回时一个表达式中,连续拷贝构造+拷贝构造->优化一个拷贝构造 (vs2019 debug)// 一些编译器会优化得更厉害,进行跨行合并优化,直接变为构造。(vs2022 debug)f2();cout << endl;// 返回时一个表达式中,连续拷贝构造+拷贝构造->优化一个拷贝构造 (vs2019 debug)// 一些编译器会优化得更厉害,进行跨行合并优化,直接变为构造。(vs2022 debug)A aa2 = f2();cout << endl;// 一个表达式中,连续拷贝构造+赋值重载->无法优化aa1 = f2();cout << endl;return 0;
}

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

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

相关文章

QT菜单之快捷菜单设计

快捷菜单又称为上下文菜单&#xff0c;通常在用鼠标右击的时候弹出。创建快捷菜单的方法和创建菜单栏菜单类似。 效果图&#xff1a; 一、将MainWindow类对象的ContextMenuPolicy属性设置为customContextMenu。 打开mainWindow.ui&#xff0c;在属性视图上找到ContextMenuPoli…

What is the OpenAI Chat Completion API tools/functions property format?

题意&#xff1a;OpenAI 聊天完成 API 的工具/函数属性格式是什么 问题背景&#xff1a; Is there any clear documentation on the format of OpenAIs Chat Completion API tools/functions object format? I understand its JSON, but there appear to be underlying requi…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…

数据结构实验二之线性表(下)

实验题5:实现循环双链表的各种基本运算的算法 题目描述 编写一个程序cdlinklist.cpp,实现循环双链表的各种基本运算和整体建表算法 (假设循环双链表的元素类型ElemType为int),并在此基础上设计一个程序exp2-5.cpp 完成以下功能。 (1)初始化循环双链表h。 (2)依次采用尾插法插入…

免费的 H5/PC 地图打卡 —— 功能代码及实现指南/功能代码已上传

在本文中&#xff0c;我们将通过天地图&#xff08;Tianditu&#xff09;实现一个简单的 H5/PC 版地图打卡功能。通过实时获取用户的位置&#xff0c;检测其与打卡点的距离&#xff0c;来决定是否可以完成打卡。代码已上传&#xff0c;本文将逐步介绍如何实现这一功能。 效果图…

EDI简化,两剂初免效果好

EDI简化&#xff0c;两剂初免效果好 大家好&#xff0c;疫苗是防控传染病的重要工具。但对于一些如HIV等病原体&#xff0c;有效疫苗的研发仍面临诸多挑战。在疫苗接种中&#xff0c;生发中心起着关键作用。近期研究表明——《Two-dose priming immunization amplifies humoral…

[数据集][目标检测]基于yolov5增强数据集算法mosaic来扩充自己的数据集自动生成增强图片和对应标注无需重新标注

【算法介绍】 YOLOv5最引人注目的增强技术之一是马赛克增强&#xff0c;它将四张不同的图像拼接成一张图像。 思路&#xff1a;首先&#xff0c;从数据集中随机选择四张图像&#xff0c;然后将它们缩放、随机裁剪&#xff0c;并按马赛克模式拼接在一起。这种方式允许模型看到…

为什么AI不会夺去软件工程师的工作?

▼ 自从AI大模型爆火以来&#xff0c;我每天的工作中&#xff0c;已经有大量的真实代码是通过AI完成的。人工智能辅助下的编程&#xff0c;确实大幅减轻了我的工作负担&#xff0c;大大提高了生产力。 大语言模型是如此成功&#xff0c;以至于无可避免地在开发者社区中引起了…

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

目录 抽象工厂模式 思维导图 接口&#xff08;抽象类&#xff09; 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 &#xff08;1&#xff09;产品接口&#xff0c;生成具体人物 &#xff08;2&#xff09;武器接口&#xff0c;生成具体…

mapboxGL 离线部署或者说去除token最简单得方法

找到本项目中得node_modules包管理器中得mapbox-gl包 找打dist文件夹下得mapbox-gl-dev.js 相比于mapbox-gl.js得压缩文件 mapbox-gl-dev.js没有压缩&#xff0c;好修改&#xff0c;也无需要编译 在mapbox-gl-dev.js找到 this._authenticate()&#xff0c;注释或者去除即可 最…

【Proteus仿真】基于51单片机的简易电压表制作(可串口远程调控)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;设计一个简易电压表&#xff1a; 采用3位LED数码管显示被测电压值&#xff1a;基本测量范围是 0-5V&#xff1b;测量误差为士0.02V。开机或复位后&#xff0c;在 LED 最…

三角型电动采光排烟天窗的高效排烟设计优势

三角型电动采光排烟天窗的排烟效果在多个方面均展现出了显著的优势&#xff0c;主要体现在以下几个方面。一、设计原理与结构特性 三角型电动采光排烟天窗采用三角形构造&#xff0c;这种设计在结构上具有显著的稳定性&#xff0c;能够抵御不同气候条件及风压的影响。同时减少了…

网站建设合同怎么写

网站建设合同成为企业与网站开发服务提供商之间不可或缺的法律文书。一份明晰而全面的网站建设合同不仅有助于规范双方权责&#xff0c;还能有效防范潜在的合同纠纷。以下是一份网站建设合同的范本&#xff0c;旨在提供参考。 一、合同双方信息 甲方&#xff08;委托方&#x…

QT| “无法粘贴窗口部件”错误以及customplot安装使用

“无法粘贴窗口部件”错误以及customplot “无法粘贴窗口部件”错误customplot下载添加到项目中使用QCustomPlot常用的代码 “无法粘贴窗口部件”错误 情景&#xff1a;使用QT设计界面&#xff0c;很多部分比较类似&#xff0c;可以复制另一个界面的ui&#xff0c;但是粘粘的时…

TS-AI:一种用于多模态个体化脑区划分的深度学习管道,并结合任务对比合成|文献速递-Transformer架构在医学影像分析中的应用

Title 题目 TS-AI: A deep learning pipeline for multimodal subject-specific parcellation with task contrasts synthesis TS-AI&#xff1a;一种用于多模态个体化脑区划分的深度学习管道&#xff0c;并结合任务对比合成 01 文献速递介绍 人类大脑在结构和功能组织上表…

武汉正向科技 格雷母线检测方式 :车检,地检

正向科技|格雷母线原理运用-车检&#xff0c;地检 地上检测方式 地址编码器和天线箱安装在移动站上&#xff0c;通过天线箱发射地址信号&#xff0c;地址解码器安装在固定站&#xff08;地面&#xff09;上&#xff0c;在固定站完成地址检测。 车上检测方式 地址编码器安装在…

单域名、多域名、通配符SSL证书,该如何选择?

随着《网络安全法》《数据安全法》相关法律法规的发布&#xff0c;履行数据保护义务&#xff0c;做好数据安全保护是每个企业的重要工作。其中&#xff0c;SSL证书作为企业网站实现HTTPS加密保护数据传输安全的必备措施&#xff0c;根据域名保护数量&#xff0c;可以分为单域名…

拼团活动开发秘籍:PHP+Redis实现暂存成团信息,提升效率!

在用户发起成团&#xff0c;与用户入团时需要保存其成团信息&#xff08;主要是活动id与团长、团员openid&#xff09;&#xff0c;暂存在redis中&#xff0c;后期需要保存到sql中&#xff0c;以便查询。 tuan_redis.php<?php include_once(/opt/*****ub/redis.php);//red…

Java语言程序设计基础篇_编程练习题**18.35(H 树分形)

目录 题目&#xff1a;**18.35(H 树分形) 代码示例 代码解释 输出结果 题目&#xff1a;**18.35(H 树分形) 一个H 树分形(本章开始部分介绍过&#xff0c;如图18-1)如下定义: 1)从字母H开始。H的三条线长度一样&#xff0c;如图 18-1a 所示。 2)字母H(以它的 sans-serif …

若依vue3.0表格的增删改查文件封装

一、因若依生成的文件没进行封装&#xff0c;维护起来比较麻烦。所以自己简单的进行封装了一下 gitee代码&#xff08;文件&#xff09;地址&#xff1a;https://gitee.com/liu_yu_ting09/ruo_yi.git 二、封装的方法&#xff08;下面绿色按钮进行全局封装一个JeecgListMixin.js…