C++刨析(this指针,构造,析构函数)

news2024/11/26 8:29:31

目录

this指针

构造函数

析构函数


this指针

在我们创建一个对象,对象去调用类中的函数的时候,有没有想过它是怎么进行修改的,回想我们以前写C语言的时候,如果我们写了一个栈,当需要操作栈中的数据时,我们需要把构造出来栈的变量的地址传过去,让函数拿到这个地址来对我们的栈进行出去操作。

 看着样子就像是一个是手动挡,一个是自动挡。手动档需要我们自己去换档,而自动挡帮我们完成了这一操作,只需要踩油门就可以了。

可到了C++当我们需要调用一个函数来实现某个功能的时候只只需要传我们需要插入或者删除的数字就可以,那么它是怎么做到的呢?这其实归功于我们的this指针,祖师爷当时在创造c++的时候,发现改变结构体需要传入结构体的指针,每次都要进行一个重复的操作区传它的地址,既然每次都要我自己去传,倒不如我帮你直接传了。那么this指针是存在哪里的呢,在VS2019下,编译器对this进行了优化,把对象的地址存放在了寄存器exc里面,而exc里面存放的额就是this的值啦。

 那么我们再来看一点,this指针可以为空吗,先来看两个比较

 为什么这里不会报错呢。其实在A调用print的时候不会发生解引用,因为print的地址不在对象中,A会作为实参传递给thi指针,this指针此时为空,但是在内部并没有对空指针进行解引用。所以就不会报错。

那么我们继续看第二个题型

 这里会崩溃就是我们在对一个空的指针进行解引用。那为什么不可以在参数列表显示this指针呢,因为它是成员函数的第一个隐含的指针形参。如果你确实想让它显示传递可以手动定义一个指针类型的参数,将this指针赋值给它,但是这样岂不是多此一举了吗。

构造函数

大家有没有想过,在我们写C语言的时候偶尔会忘记初始化呢?而在C++里面就完全不用担心,因为我们的祖师爷在创造C++的时候同可能同样也遇到过这个问题,那么一想,反正写出来都要初始化,那我直接帮你初始化就行了。所以一个构造函数就由此诞生了。

我们先来了解一下什么是构造函数已经构造函数有哪些结构

1:构造函数是一个特殊的成员函数,虽然它名字叫构造函数,但他的功能其实并不是开空间创造对象,而是完成对对象的初始化

2:构造函数与类名相同。

3:构造函数没有返回值

4:构造函数可以重载

5:如果类中没有定义构造函数,那么c++编译器会自动生成一个构造函数,如果用户显示定义了编译器就不会在生成了。

6:无参的构造函数和全缺省的构造函数都称为默认构造函数并且构造函数只能有一个。

那么我先看第一点,入如介绍一样,构造函数时一个特殊的构造函数,但是它的功能不是去构造一个一快空间,而是对对象初始化。怎么说呢,就是当我们定义一个类实例化之后,这个对象会去调用构造函数,对对象中的成员进行初始化,但值得注意的一点是,当时祖师爷在设计构造函数的时候留下了一个坑,那就是内置类型不会对它经行初始化。(编译器有两种类型,内置类型/基本类型(int,double,long....指针),自定义类型(用户自己定义的类型,如struct/class))。

 我们这里也确实可以看到,在调用了date的构造函数之后a,b,c的值是随机值,所以我们在有内置类型的时候尽量自己去写构造函数。

大家觉得构造函数因该把他初始化成0,但是却没有这样干,所以说这是祖师爷留下的一个坑,但也会有人说为什么后面不改一下让它初始化成0呢,因为可能有些人用的就是这个随机值,如果修改了的话可能用这些随机值的公司就要怨气满腹了。后来呢在C++11标准发布的时候打了一个补丁在成员申明的时候可以给缺省值,但是要记住这不是初始化,这是在告诉编译器,你生成构造函数的时候可以用我给的这个值。

根据上面的我们可以反射知道构造函数其实也可以指定带参数的,但是如果要带参数而对象没有传参数就会报错。

我们在让构造函数带指定参数的时候同样最好也把它全部写成全缺省的参数,方便我们对象后续的调用,如果写半缺省(加入缺省一个参数)的话那么在对象传参的时候就必须要传一个参数,否者就会报错

 所以当我们要去写一个构造函数的时候最好把它写成全缺省参数,如果我们不需要用它就可以手动把对象的成员全部初始化成0。

析构函数

接下来我们看看析构函数,了解一下它的概念

1:析构函数和构造函数的功能相反,析构函数不是完成对对象本身的销毁,局部对象的销毁是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对对象中的资源销毁工作

2:析构函数是类名前面加一个~

3:无参数无返回类型

4:一个类只有一个析构函数,若没有写的话则由系统自动调用

5:对象生命周期结束的时候,c++编译器会自己调用析构函数

我们定义了一个对象,这个对象是存在栈帧中的,当我们去调用这个析构函数的时候不是说直接把对象销毁了,对象是在结束的时候由编译器去销毁的,而构造函数只是把对象中所占用的资源归还贵操作系统。

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

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

相关文章

通过Mars3d在地图上加载风力发电机车模型

首先理清需求,通过Mars3d的基础项目,在基础项目模板上添加一个风力发电机模型。 Mars3d官网的基础项目下载地址:Mars3D三维可视化平台 | 火星科技 gitee地址: git clone https://gitee.com/marsgis/mars3d-vue-project.git 下载…

【Linux】7、一篇文章学习 Linux 中一些硬核的常用知识

目录 一、systemctl二、软链接三、日期(date 命令)四、Linux 的时区(1) 修改时区(2) ntp 五、IP 地址六、主机名七、域名解析八、配置 Linux 的固定 IP 地址(1) 在 VMwareWorkstation 中配置 IP 地址网关和网段(IP 地址的范围)(2)…

深入理解计算机系统2--理解计算机系统的基本组成以及程序的运行

深入理解计算机系统2–理解计算机系统的基本组成以及程序的运行 前言 前面一章简单记录了程序在计算机系统是以什么形式被存储的以及编译器编译的过程,这篇文章则会记录程序是如何被运行的,它在磁盘中是如何被读取,计算机系统将会通过那些器…

BPF技术整理笔记

目录 eBPF是什么? eBPF是做什么的?可以解决什么问题? eBPF可以带来的解决方案是什么? eBPF的技术点 eBPF hookeBPF MapeBPF Helper FunctioneBPF有什么限制吗? 前言 21年因为项目需求而要开发一个工具,可以…

Bitmap引起的OOM问题

作者:向阳逐梦 1.什么是OOM?为什么会引起OOM? 答:Out Of Memory(内存溢出),我们都知道Android系统会为每个APP分配一个独立的工作空间,或者说分配一个单独的Dalvik虚拟机,这样每个APP都可以独立…

你的 Redis为什么变慢了?一文讲透Redis性能优化如何做

一、Redis为什么变慢了 1.Redis真的变慢了吗? 对 Redis 进行基准性能测试 例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下&#xff…

哈夫曼树【北邮机试】

一、哈夫曼树 机试考察的最多的就是WPL,是围绕其变式展开考察。 哈夫曼树的构建是不断选取集合中最小的两个根节点进行合并,而且在合并过程中排序也会发生变化,因此最好使用优先队列来维护单调性,方便排序和合并。 核心代码如下…

2023有哪些适合学生的蓝牙耳机?盘点四款适合学生的无线蓝牙耳机

随着时代的发展,人们更青睐于能够提升生活品质的产品。蓝牙耳机因为摆脱了线的束缚,使用体验会更好。接下来,我来给大家推荐几款适合学生用的无线蓝牙耳机,有需要的朋友可以当个参考。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

探索未来的数字人生:全景VR数字人

在数字化时代,人工智能和虚拟现实技术正日益成为我们生活中不可或缺的一部分。而全景VR数字人,则是这一时代的最新产品,吸引了越来越多的关注和研究。 一、什么是全景VR数字人? 全景VR数字人是一种通过虚拟现实技术创造的数字人形…

学术ChatGPT——利用ChatGPT助力日常工作与学习

ChatGPT的出现给各个行业带来了前所未有的冲击,其中也包括学术研究领域。在学术研究领域,有着「数学天才」之称陶哲轩之前就曾表示,他已经将ChatGPT纳入了自己的工作流程。 那么做为一名普通的工作或者学习的人员,如何使用ChatGPT…

[mars3d 学习] 最近升级版本造成的问题

1、mars3d升级3.5以上,使用的时候报错; 需要看下 Mars3D三维可视化平台 | 火星科技 版本更新日志; 使用将Cesium的版本升级到1.103 2、升级Cesium到1.103,之后打包又会报错 - error in ./node_modules/mars3d-Cesium/Build/Cesi…

用手机APP操作使用井用采样器更省时省力

井用采样器的主要功能特点就是:机身小巧,方便操作。可用于井下作业,手机APP可实时查看采样数据,节省人力。 利用自动采样器进行水样采集可以说节省很大的人力物力,但是有时为了采到更具代表性的水样,我们需…

如何选择多参数水质分析仪?

如何选择适合的多参数水质分析仪? 首先水质检测仪分为实验室(台式)和户外使用的便携式多参数水质检测仪。我们呢就要了解自己的需 求使用在什么领域,根据使用领域选择仪器;其次就是选择需要测定的指标,最好…

JAVA-6-[Spring框架]Bean的作用域和生命周期

1 Spring Bean 1、Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)。 2、普通bean:在配置文件中定义的bean类型就是返回的类型。 3、工厂bean:在配置文件中定义的bean类型可以和返回类型不一样。 第一步 创建类…

Streamlit 使用介绍

Streamlit 使用介绍 安装和运行参考资料 公共组件页面设置显示代码并运行st.help 查询帮助文档多页渲染 对象渲染直接渲染对象文本渲染st.markdown代码渲染公式渲染 展示图表显示表格趋势小卡片 显示图表显示媒体画迷宫显示本地图片播放视频/音频 显示状态彩蛋-放气球进度条 互…

KVM虚拟机的定时逐次开机设定方法-systemd方式

前言:KVM虚拟机系统是榨取服务器最大性能的一种好方法,但是谁也不想让服务器启动的时候要等待5分钟甚至以上的时间。 为了减轻服务器开机时的任务数量,需要虚拟机在开机后一段时间内,按顺序逐次启动,以达到各个服务间的…

A Time Series is Worth 64 Words(PatchTST模型)代码解析

前言 A Time Series is Worth 64 Words论文下载地址,Github项目地址,论文解读系列本文针对PatchTST模型参数与模型架构开源代码进行讲解,本人水平有限,若出现解读错误,欢迎指出开源代码中分别实现了监督学习(PatchTST…

千万级直播系统后端架构设计

1、架构方面 1.1 基本 该图是某大型在线演唱会的直播媒体架构简图。 可以看出一场大型活动直播涵盖的技术方案点非常庞杂,本节接下来的内容我们将以推拉流链路、全局智能调度、流量精准调度以及单元化部署,对这套直播方案做一个展开介绍。 1.2 推拉流链…

2023年大厂裁员严重,软件测试行业真的饱和了吗?

这短时间以来后台有很多小伙伴说找工作难,并且说软件测试行业饱和了?竟然登上了热榜 那么我今天带大家看看真实的市场行情,往下看 这个是公司联合某厂的HR招聘真实情况,很明显【软件测试】投简历竟然高达9999沟通才1千多&#xf…

chatgpt 中文版免费访问

chatgpt 中文版免费访问 简介一、ChatGPT中文网二、 ChatGPT三、ChatGPTWEB四、博弈AI五、小熊共享六、tab精灵七、AI文本工具站1、有直接chatgpt体验对话2、文案工具箱 简介 最近chatgpt太火了,用起来十分方便。chatgpt是一种基于人工智能技术的语言模型&#xff…