C++——动态管理(类和对象收尾)

news2024/10/5 17:20:42

作者:几冬雪来

时间:2023年5月14日

内容:C++内存管理讲解

目录

前言: 

1.类的对象(收尾): 

1.友元函数:

2.内部类: 

3.匿名对象:

4.优化:

2.C++的动态内存管理: 

1.动态内存管理的管理方式(malloc,realloc,calloc,free): 

2.new和delete内置操作符: 

结尾: 


前言: 

通过这篇博客的主题可以看出,在这一篇博客我们将讲解一个新的知识点,也就是我们的内存管理的模块,而在这之前我们要将我们之前的类和对象的内容进行收尾。

1.类的对象(收尾): 

在这里在学习新知识之前,我们需要将我们的旧知识,也就是类和对象板块的知识做一个收尾的工作。 

1.友元函数:

在这里我们的友元函数主要就是突破类的限制,突破C++中类的封装

在我们的类外面有时候我们是需要用对象去访问我们类的成员的。 

在这里经典的就是我们的流插入和流提取操作符的重载。 

因为流插入和流提取的代码如果我们写在类中变成成员函数,它们就会出现抢占位置的操作,抢占左操作数

但是这里其实我们在C++中并不是经常使用友元函数,它提供了遍历,但是增加了偶合,

这里还有友元类

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

并且友元函数还许多的规定在:

这里我们就对友元有个大概的了解即可。

2.内部类: 

接下来我们学习的知识点叫做内部类。 

在这里我们简单的将内部类的代码进行书写,并且计算它的大小。 

从结果上来看大小为4,那么这里的大小是怎么样进行计算的呢?

首先用到上一篇博客的知识,我们的k并没有存到对象里面,所以没有参与计算

这里肯定要计算我们的h的大小,并且在这里A里面没有我们b对象,所以我们也没有去计算b的大小。 

除非我们用B类在A类中创建对象才有计算b的大小

它并没有占空间,因为它只是声明。 

并且在调用的时候我们也要进行修改。

当然在这里我们的内部类也受访问限定符的限制,也就是受到公有和私有的限制。  

同时在这里我们的内部类是外部类的友元

只不过在C++中我们并不经常使用内部类,我们在外部类定义的东西,内部类可以访问,外部类也可以访问。

3.匿名对象:

接下来就是来讲解我们的匿名对象。

在这里我们先将其写法写出来。 

这里就是我们的有名对象和匿名对象。

当然我们的调用函数也可以使用匿名对象来对其进行书写。 

这里我们上面的那种方式就是有名函数,下面的书写方式就是匿名对象的形式

这里要注意匿名对象只用于调用一次,如果调用多次函数要用有名对象

并且我们的匿名对象即用即销毁。 

这里我们将全部的代码拿出来看看。 

在这里如果要传参的话,我们也可以在匿名对象处进行传参的操作,这样我们才能继续使用我们的匿名对象的操作

同样的这里我们也可以对命名对象进行引用,不过引用命名对象的时候要注意一些点

首先在这里,我们不能通过这种形式用ra去访问我们的匿名对象。 

这是因为我们的匿名对象和临时对象类似,具有常性

但是在这里我们只要在引用的前面加入我们的静态const就可以进行引用

并且这里并不是出现野引用,这里的const引用延长了对象的生命周期,生命周期在当前函数的局部域。 

这里的匿名对象的创建没有个数的限制。 

4.优化:

在这里我们就直接将代码给写出来。

在这里,我们的下面的方法会从两个构造优化为构造

因为它们是在同一行进行的这两种行为,所以会被优化,而且上面的那种方法因为并不是同一行,而是连续两行的执行,所以并不会被优化。 

从这里我们也可以看出来优化所带来的便利。

在这里下面的方法我们要多调用一次构造,并且还要执行赋值的操作。 

2.C++的动态内存管理: 

在我们的C++中,有几类的数据,我们将它们称为:

局部数据;静态数据和全局数据;常态数据;动态申请数据

并且在这里我们要对每个数据的存放空间进行划分区域。 

并且这块空间被我们称为进程地址空间。 

接下来我们就通过答题来了解我们这些数据。 

在这里我们的第一个在全局所以它在——静态区。

第二个是静态的所以它在——静态区。

第三个也是静态的在——静态区。

接下来我们第四个是局部变量所以在——栈。

第五个是一个数组所以也在——栈。

接下来我们来再讲解6道题。  

在这里我们的char2毋庸置疑在——栈。

*char2为数组首元素的地址,在这里数组首元素的地址也是在——栈。

pchar3为指针虽然被const修饰,但是实际上它是指针所以在——栈。

*pchar3是对pchar3进行解引用,里面的数据被const修饰所以在——常量区。

 ptr1为指针,在——栈。

*ptr1是对ptr1的解引用,里面ptr1的内容是通过malloc得到的,所以它在——堆

在这里我们也可以去计算它们的大小

1.动态内存管理的管理方式(malloc,realloc,calloc,free): 

在这里我们出一个问题。 

在这里如果我们对p3进行释放的话,这里需要对p2进行释放

学过C语言的我们应该知道,这里分两种情况一种是原地扩容一种是异地扩容,原地扩容的话,这里我们就是在p2的基础上对其进行扩容操作

而异地扩容的话在这里,我们要先找到合适的空间,然后将p2的内容拷贝过去,接下来将p2释放掉

因此上面的要对p2进行释放,下面的代码不需要

2.new和delete内置操作符: 

接下来我们要在这里我们上面的代码可以通过malloc来进行内存空间的开辟,这种用法是C语言我们常用的用法

而且在C++中我们不仅依旧可以这样使用,我们还引入了新的操作符来完成我们上面的步骤。 

在这里我们使用新的操作符new来完成我们的操作。

并且new代码的书写形式也是十分的便捷,就是new+类型即可

同样的我们的new也可以对数组进行

这里和C语言malloc后释放使用free不同,我们的new要进行释放的话就需要用到我们和new配套的另一个操作符delete了。 

而且我们创建空间之后肯定要初始化的,这里我们的C语言就不讲了,来讲讲我们的new操作符的初始化方式。 

在那之前我们先来讲解一个new操作符要大致知道的点。

在这里我们要注意,像我们下面的代码有讲过,就是申请10个int的数组。

但是上面的代码并不是申请数组,而是初始化。 

那这里我们的数组初始化又是怎么样的呢?

  

并且和我们的C语言一样,这里后面没有被初始化的空间我们默认存放的是0

那么有人就在这里问了,我们的new创建出来是为了什么呢?上面的写法都可以书写,为什么要有new操作符呢? 

这里我们就引用以前的一段代码来分析一下

在这里我们左边的代码是我们数据结构时候链表的代码

在那个时候我们要书写的话是用到右边上面的代码进行书写的。

但是在我们的new到来之后,我们就可以使用下面的这种书写方法,它可以开空间并且调用构造函数的初始化,这就是我们new真正被创建出来的意义。 

结尾: 

到这里我们的C++板块的类和对象到这里就正式的结束了,接下来我们要进行C++又一大板块的学习了,在学习新知识的同时,我们也不能忘记现有的就知识要多复习。最后希望这篇博客能给大家带来帮助。

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

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

相关文章

常见基础算法

一、排序 & 查找算法 1.1 冒泡排序 相邻的数据进行比较。每次遍历找到一个最大值。 public void sort(int[] nums) {if (nums null) {return;}for (int i 0; i < nums.length; i) {for (int j 0; j < nums.length - 1 - i; j) {if (nums[j] > nums[j 1]…

Python每日一练(20230515) 只出现一次的数字 I\II\III

目录 1. 只出现一次的数字 Single Number 2. 只出现一次的数字 II Single Number II 3. 只出现一次的数字 III Single Number III &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 leetcod…

开源项目ChatGPT-website再次更新,累计下载使用1600+

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

数据交换方式(电路,报文,虚电路分组交换,数据报分组交换)

电路交换&#xff1a; 电路交换是通信网中最早出现的一种交换方式&#xff0c;在进行数据传输前&#xff0c;两个结点之间必须先建立一条专用&#xff08;双方独占&#xff09;的物理通信链路。该线路在整个数据传输期间一直被独占&#xff0c;用户始终占用端到端的固定传输带…

python实现带有操作界面的计算器程序,实现基本的数值计算,支持负数、小数、加减乘除等运算。

一、程序要求 python实现带有操作界面的计算器程序,实现基本的数值计算,支持负数、小数、加减乘除等运算。 预期计算器界面如下: 二、代码实现 1、python3自带tkinter,可以用来做可视化界面: import tkinter as tk import re 2、新建窗口对象,设置高宽、设置标题和背景…

【分布族谱】正态分布和对数正态分布的关系

文章目录 正态分布对数正态分布的推导测试 正态分布 正态分布&#xff0c;最早由棣莫弗在二项分布的渐近公式中得到&#xff0c;而真正奠定其地位的&#xff0c;应是高斯对测量误差的研究&#xff0c;故而又称Gauss分布。。测量是人类定量认识自然界的基础&#xff0c;测量误差…

UEFI 界面实例解析

这篇文章主要记录一些setup界面的实例&#xff0c;这些实例都是EDK上的&#xff0c;我们可以看到如下图&#xff1a; 上面三个为banner&#xff0c;下面的都是通过LABLE动态加载的&#xff0c;代码如下&#xff1a; 我们可以看到 UiListThirdPartyDrivers (HiiHandle, &gEf…

Sentinel 熔断降级和黑白名单控制

一、熔断降级 1、概述 除了流量控制以外&#xff0c;对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块&#xff0c;可能是另外的一个远程服务、数据库&#xff0c;或者第三方 API 等。例如&#xff0c;支付的时候&#xff0c;…

【C++ 入坑指南】(06)运算符

文章目录 一、算术运算符二、赋值运算符三、比较运算符四、逻辑运算符五、算法题5.1、拆分位数 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 运算符类型作用算术运算符用于处理四则运算赋值…

交换机配置第十二讲(ACL访问控制)

1.实验介绍 设备规划 类型名称数量终端PC3路由器AR22403 IP规划 主机 ip链接交换机端口网关client1192.168.1.2AR1-g/0/0/0192.168.1.1client2192.168.2.2AR2-g/0/0/1192.168.2.1client3192.168.3.2AR3-g/0/0/1192.168.3.1 2. 连线图介绍 连线顺序 3. 基础配置介绍 我们首…

基于SSM的高校共享单车管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

〖大前端 - 基础入门三大核心之JS篇㉞〗- JavaScript 的「立即执行函数IIFE」

当前子专栏 基础入门三大核心篇 是免费开放阶段。推荐他人订阅&#xff0c;可获取扣除平台费用后的35%收益&#xff0c;文末名片加V&#xff01;说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费开放&#xff0c;购买任意白宝书体系化专栏可加入TFS…

Threejs进阶之十四:在uniapp中使用threejs创建三维图形

在uniapp中使用threejs 一、uni-app介绍二、新建uni-app项目三、安装three.js库四、在vue组件中引入three.js库五、创建场景(Scene)和相机(Camera)六、创建渲染器(Renderer)七、创建物体和灯光八、渲染场景(Scene)九、运行测试核心代码 一、uni-app介绍 uni-app是一个基于Vue.…

AutoSar CanNm笔记

文章目录 网络管理目的CanNM与其他模块之间关系主动唤醒和被动唤醒状态管理1. 总线睡眠模式&#xff08;Bus-Sleep Mode&#xff09;2. 准备总线睡眠模式&#xff08;Prepare Bus-Sleep Mode&#xff09;3. 网络模式&#xff08;Network Mode&#xff09;3.1 重复报文状态(Repe…

SD-如何训练自己的Lora模型

官方地址&#xff1a;GitHub - bmaltais/kohya_ss 尝试过mac和Ubuntu&#xff0c;装上后都会有问题 Windows按照官方步骤安装即可 第一步 git clone https://github.com/bmaltais/kohya_ss.git cd kohya_sspython -m venv venv .\venv\Scripts\activatepip install torch1.…

1710_开源pdf阅读器SumatraPDF使用体验

全部学习汇总&#xff1a; GreyZhang/g_GNU: After some years I found that I do need some free air, so dive into GNU again! (github.com) 被很多国产免费软件折腾的电脑有点扛不住了&#xff0c;从昨天起打算在Windows上开始开源之路。先用LibreOffice换掉了之前一直觉得…

ansible roles常用用法

目录 一、说明 二、创建 ansible 环境 三、实验操作 四、install_ansible.sh 脚本内容 一、说明 该文档是日常经常使用的模板&#xff0c;通过该例子让更多的初学者了解ansible 剧本的写法&#xff0c;很多情况&#xff0c;可以按照该模版来套用即可。 读者不需要下载…

GPT前2代版本简介

承接上文ChatGPT进化的过程简介 2018年&#xff0c;Google的Bert和OpenAI的GPT绝代双骄&#xff0c;两者非常像&#xff0c;都是语言模型&#xff0c;都基本上是无监督的方式去训练的&#xff0c;你给我一个文本&#xff0c;我给你一个语言模型出来。 GPT前两代没有什么特别的…

好看的皮囊千篇一律,有趣的书籍万里挑一,学习Java必读的两款书籍推荐

今天给各位学习Java的小伙伴儿们推荐两本Java路线上必不可少的书籍&#xff0c;核心卷1和卷2&#xff0c;大家可根据自己的情况种草。正所谓&#xff0c;书多不压身。 Java核心技术卷1 Java 诞生 27 年来&#xff0c;这本享誉全球的 Java 经典著作《Core Java》一路伴随着 J…

2023年了,快去给你的博客加上一个主题吧~

最近闲逛github&#xff0c;发现了一个不错的博客主题&#xff0c;分享给大家。 这个主题主要是用于博客园的个人主页美化用的。 主题地址&#xff1a;Silence - 专注于阅读的博客园主题 目录 一、获取文件 &#xff08;1&#xff09;样式文件 &#xff08;2&#xff09;脚本…