[C++]3.类和对象下(this指针补充)+ 类和对象中构造函数和析构函数。
类和对象下(this指针补充)+ 类和对象中构造函数和析构函数
- 一.this补充:
- 1.概念总结:
- 2.两个问题:
- 二.构造函数和析构函数:
- 一.类的默认构造:
- 1.初始化和清理:
- 2.拷贝复制:
- 3.取地址重载:
- 二.构造函数:
- 1.概念:
- 2.特征总结:
- 1.默认构造:
- 2.默认构造的作用:
- 2-1:表面
- 2-2:内涵
- 二.析构函数:
- 1.概念:
- 2.特征总结:
- 3.意义:
一.this补充:
1.概念总结:
1.this 的作为成员函数的形参的时候满足 类的类型 * const this满足这样一个情况,说明this指针是不可以被修改的。
2.只能在成员函数的内部去使用,
3.this指针本质上是成员函数的一个隐藏的形参,通过外面的实参传给形参。实参其实是对象的地址。对象本身不回去存贮this。
4.this指针是成员函数的第一个隐藏的指针形参,通过ecx寄存器把地址值传过去的不需要程序员进行处理。
5.this指针在成员函数中是可以去使用的。

2.两个问题:
1.this指针存在哪里?
1-1:存在函数栈帧里面。
1-2:vs 2022: 通过ecx寄存器进行存贮:
2.this指针可以为空吗?
this指针可以为空但是这个this指针作为成员函数的时候不可以去访问类的成员变量,只能访问成员函数中不需要访问成员变量的一些函数是不会出问题的。



二.构造函数和析构函数:
一.类的默认构造:
1.当一个类是空类的时候,会默认生成6个默认构造。
1.初始化和清理:
1-1:构造函数主要完成成员变量的初始化工作:
1-2:析构函数主要完成清理工作:
2.拷贝复制:
2-1:拷贝构造是使用同类对象初始化创建对象:
2-2:赋值重载主要是是把一个对象赋值给另一个对象。
3.取地址重载:
3-1:主要是普通对象和const对象取地址,这两个很少会自己实现:
二.构造函数:
1.概念:
构造函数是一个比较特殊的函数,他会在对象初始化的时候由编译器进行自动调用而且只会在一个对象的生命周期中只会去调用一次。
2.特征总结:
1.构造函数名称和类名称相同:
2.构造函数没有返回值:
3.构造函数在对象初始化的时候由编译器自己调用:
//我们的构造函数在这里进行了显示类型的构造:

4.构造函数是可以重载的:
4-1:函数的无参的构造函数和全缺省的初始化都是正常定义一个对象:
4-2:对象的初始化,显示的去传参数。
5.5. 如果类中没有进行显示的定义构造函数,那么C++编译器会默认生成一个无参的默认构造。
1.默认构造:
1.用户没有显示的构造函数,其他操作的什么都没有:生成随机值。

2.构造函数没有参数也是一种默认构造。

3.构造函数全部缺省也是一种默认构造:

4.总结:我们在进行对象初始化的时候不需要进行参数的传递,编译器就回去调用默认构造。
2.默认构造的作用:

2-1:表面
我们下面实现了一个栈这个类,如果我们使用默认构造调用的了默认构造函数进行初始化:

#include<iostream>
#include<stdlib.h>
#include<assert.h>using namespace std;class Stack
{
public://1.初始化:Stack(int capacity_num = 5){int* tmp = (int*)malloc(sizeof(int) * capacity_num);if (tmp == nullptr){perror("malloc file");exit(-1);}arr = tmp;sz = 0;capacity = 5;}//2.判断栈空:bool Empty(){assert(arr != nullptr);if (sz == 0){return true;}return false;}//3.压栈:void Push(int x){assert(arr != nullptr);if (sz == capacity){int* tmp = (int*)realloc(arr, sizeof(int) * (capacity * 2));if (tmp == nullptr){perror("realloc file");exit(-1);}arr = tmp;capacity *= 2;}arr[sz++] = x;}//4.获取栈顶元素:int top(){assert(arr != nullptr);if (!Empty()){return arr[sz];}}//5.删除栈顶元素:void del(){assert(arr != nullptr);if (!Empty()){arr[sz--] = 0;}}//6.打印栈中数据:void print(){assert(arr != nullptr);if (!Empty()){for (int i = 0; i < sz; i++){cout << arr[i] << "->";}cout << endl;}}
private:int* arr;int sz;int capacity;
};int main()
{Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);s1.print();s1.del();s1.del();s1.print();return 0;
}
2-2:内涵
C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int/char…,自定义类型就是我们使用class/struct/union等自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。
我们下面实现一个自己通过栈实现的队列:
2-2:(重要:)根据上面的图片我们知道,内置类型是不会去处理的,自定义类型会去调用他自己默认构造!
2-2:根据这个问题我们C++ 11 支持了变量在声明的时候给一个初始值一般是面对的是内置类型,因为内置类型不会去处理:!

//2.栈实现队列:class Myqueue
{
public://1.入队列:void my_push(int x){push.Push(x);sum++;}//2.出队列:void my_pop(){if (!pop.Empty()){while (!push.Empty()){pop.Push(push.top());push.del();}}pop.del();sum--;}//3.获取队头元素:int get_top(){if (pop.Empty()){while (!push.Empty()){int tmp = push.top();pop.Push(tmp);push.del();}}return pop.top();}//4.判断队列是否为空:bool Eppty(){if (sum > 0){return false;}return true;}
private:Stack push;Stack pop;//注意C++11 中针对内置类型成员不初始化的缺陷又打了一个补丁://内置类型成员变量在类中声明的时候可以给默认值:int sum = 0;
};int main()
{Myqueue Q1;return 0;
}
二.析构函数:
1.概念:
析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
2.特征总结:
1.函数名和类名相同但是需要在前面加上一个~(按位取反)
2.没有参数没有返回类型:
3. 对象生命周期结束时,C++编译系统系统自动调用析构函数
4. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载。
3.意义:
栈这样的类的析构才是有意义的:
#include<iostream>
#include<stdlib.h>
#include<assert.h>using namespace std;class Stack
{
public://1.初始化:Stack(int capacity_num = 5){int* tmp = (int*)malloc(sizeof(int) * capacity_num);if (tmp == nullptr){perror("malloc file");exit(-1);}arr = tmp;sz = 0;capacity = 5;}//2.判断栈空:bool Empty(){assert(arr != nullptr);if (sz == 0){return true;}return false;}//3.压栈:void Push(int x){assert(arr != nullptr);if (sz == capacity){int* tmp = (int*)realloc(arr, sizeof(int) * (capacity * 2));if (tmp == nullptr){perror("realloc file");exit(-1);}arr = tmp;capacity *= 2;}arr[sz++] = x;}//4.获取栈顶元素:int top(){assert(arr != nullptr);if (!Empty()){return arr[sz];}}//5.删除栈顶元素:void del(){assert(arr != nullptr);if (!Empty()){arr[sz--] = 0;}}//6.打印栈中数据:void print(){assert(arr != nullptr);if (!Empty()){for (int i = 0; i < sz; i++){cout << arr[i] << "->";}cout << endl;}}//7.栈中数据的清理:~Stack(){free(arr);arr = nullptr;sz = 0;capacity = 0;}
private:int* arr;int sz;int capacity;
};//2.栈实现队列:class Myqueue
{
public://1.入队列:void my_push(int x){push.Push(x);sum++;}//2.出队列:void my_pop(){if (!pop.Empty()){while (!push.Empty()){pop.Push(push.top());push.del();}}pop.del();sum--;}//3.获取队头元素:int get_top(){if (pop.Empty()){while (!push.Empty()){int tmp = push.top();pop.Push(tmp);push.del();}}return pop.top();}//4.判断队列是否为空:bool Eppty(){if (sum > 0){return false;}return true;}
private:Stack push;Stack pop;//注意C++11 中针对内置类型成员不初始化的缺陷又打了一个补丁://内置类型成员变量在类中声明的时候可以给默认值:int sum = 5;
};int main()
{Stack s1;return 0;
}
1.通过观察下面的动图我们可以发现,在主函数栈帧结束以后我们的类对象开辟的空间被释放了!
2.我们观察一下我们实现队列的默认构造和默认析构:

相关文章:
[C++]3.类和对象下(this指针补充)+ 类和对象中构造函数和析构函数。
类和对象下(this指针补充) 类和对象中构造函数和析构函数 一.this补充:1.概念总结:2.两个问题: 二.构造函数和析构函数:一.类的默认构造:1.初始化和清理:2.拷贝复制:3.取…...
OpenLDAP LDIF详解
手把手一步步搭建LDAP服务器并加域 有必要理解的概念LDAPWindows Active Directory 服务器配置安装 OpenLDAP自定义安装修改对象(用户和分组等)修改olcSuffix 和 olcRootDN 属性增加olcRootPW 属性修改olcAccess属性验证新属性值 添加对象(用…...
Leetcode.33 搜索旋转排序数组
题目链接 Leetcode.33 搜索旋转排序数组 mid 题目描述 整数数组 n u m s nums nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前, n u m s nums nums 在预先未知的某个下标 k ( 0 ≤ k < n u m s . l e n g t h )…...
ES 8.x 向量检索性能测试 把向量检索性能提升100倍!
向量检索不仅在的跨模态检索场景中应用广泛,随着chat gpt的或者,利用es的向量检索,在Ai领域发挥着越来越大的作用。 本文,主要测试es的向量检索性能。我从8.x就开始关注ES的向量检索了。当前ES已经发布到 8.10 版本。以下是官方文…...
云计算——ACA学习 云计算架构
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页 目录 写在前面 前期回顾 本期介绍 一.云计算架…...
基于深度学习实现一张单图,一个视频,一键换脸,Colab脚本使用方法,在线版本,普通人也可以上传一张图片体验机器学习一键换脸
基于深度学习实现一张单图,一个视频,一键换脸,Colab脚本使用方法,在线版本,普通人也可以上传一张图片体验机器学习一键换脸。 AI领域人才辈出,突然就跳出一个大佬“s0md3v”,开源了一个单图就可以进行视频换脸的项目。 项目主页给了一张换脸动图非常有说服力,真是一图…...
leetcode 21
递归的方式 class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 nullptr){return l2;}else if(l2 nullptr){return l1;}else if(l1->val < l2->val){l1->next mergeTwoLists(l1->next, l2);return l1;}else if(l1->va…...
【Spring Cloud】openfeign负载均衡方案(和lb发展历史)
文章目录 版本1:原始loadBalancerClient方案版本2:ribbon-loadbalancer方案版本3:openfeign方案(即**方案2openfeign版本**) 本文描述了Spring Cloud微服务中,各个服务间调用的负载均衡方案的升级历史&…...
R语言:主成分分析PCA
文章目录 主成分分析处理步骤数据集code主成分分析 主成分分析(或称主分量分析,principal component analysis)由皮尔逊(Pearson,1901)首先引入,后来被霍特林(Hotelling,1933)发展。 主成分分析是一种通过降维技术把多个变量化为少数几个主成分(即综合变量)的统计分…...
Linux下磁盘备份、文件备份和定时备份命令指南
文章目录 磁盘备份和定时备份命令指南1. 引言2. 磁盘备份命令dda. 简介和基本用法b. dd命令的参数和选项说明c. 使用dd命令进行磁盘镜像备份的步骤d. 恢复备份数据的方法和注意事项e. 示例:使用dd命令备份和还原磁盘镜像 3. 磁盘备份命令tara. 简介和基本用法b. tar…...
电脑软件:推荐一款非常强大的pdf阅读编辑软件
目录 一、软件简介 二、功能介绍 1、界面美观,打开速度快 2、可直接编辑pdf 3、非常强大好用的注释功能 4、很好用的页面组织和提取功能 5、PDF转word效果非常棒 6、强大的OCR功能 三、软件特色 四、软件下载 pdf是日常办公非常常见的文档格式,…...
Android 13.0 系统开机屏幕设置默认横屏显示
1.概述 在13.0的系统产品开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从 两部分来实现,一部分是系统开机动画横屏显示,另一部分是系统屏幕显示横屏显示,从这两方面就可以做到开机默认横屏显示了 2.系统开机设置默认横屏显…...
Redis -- 基础知识1
1.介绍 1.初识Redis Redis:The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. in-memory data:在内存中存储,Redis是在分布式系统中存储起作用的 解释&am…...
ubuntu 20.04 passwd 指令不能使用
Linux 更改用户密码报Changing password for user 用户名. passwd: Module is unknown或更改新增用户密码passwd:未知的用户名 报错信息如下: 解决方法: 可以排查 /etc/pam.d/passwd配置文件 注释掉包含pam_passwdqc.so模块的行,…...
单片机郭天祥(02)
1:解决keil5软件的乱码问题,修改编码为UTF-8 2:打开keil5使用debug对编写好的程序进行调试 给程序打上断点 使用仿真芯片 更改设备管理器相关设置 接通电源后点击debug连接到51单片机 使用stc-isp获取延时函数 将延时函数添加进入创建好的…...
Hadoop3教程(三十五):(生产调优篇)HDFS小文件优化与MR集群简单压测
文章目录 (168)HDFS小文件优化方法(169)MapReduce集群压测参考文献 (168)HDFS小文件优化方法 小文件的弊端,之前也讲过,一是大量占用NameNode的空间,二是会使得寻址速度…...
metersphere 接口自动化
Metersphere 使用步骤大致如下: 安装 Metersphere Metersphere 是一款基于 Docker 的应用程序,因此在使用 Metersphere 之前,需要先安装 Docker。安装 Docker 后,再下载 Metersphere 的安装包并解压缩。 启动 Metersphere 在终…...
Mac上安装和配置Git
在Mac上安装和配置Git是一个相对简单的过程,以下是一份详细的步骤指南。 首先,你需要确保你的Mac已经安装了Homebrew(如果还没有安装,可以通过以下命令安装:),Homebrew是一个包管理器ÿ…...
【文件操作】Java -操作File对象
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 文件操作 Java - File对象 Java - File对象 Fi…...
Socks5代理技术:驱动数字化时代跨界发展的利器
随着全球数字化进程的加速推进,Socks5代理技术作为一项关键的网络技术正日益成为推动跨界电商、爬虫数据分析、企业出海以及游戏体验优化等领域发展的重要驱动力。其高效稳定的网络连接能力以及灵活的应用方式,不仅为企业提供了全球市场拓展的无限可能&a…...
wan2.1-vae效果可视化对比:同一提示词下1024×1024 vs 2048×2048细节放大实测
wan2.1-vae效果可视化对比:同一提示词下10241024 vs 20482048细节放大实测 你肯定遇到过这种情况:用AI生成了一张图,乍一看挺不错,但放大一看,细节就糊了,或者充满了奇怪的噪点和扭曲。尤其是在需要高清大…...
音乐自由解决方案:Listen1音乐聚合工具使用指南
音乐自由解决方案:Listen1音乐聚合工具使用指南 【免费下载链接】listen1_chrome_extension one for all free music in china (chrome extension, also works for firefox) 项目地址: https://gitcode.com/gh_mirrors/li/listen1_chrome_extension 你是否曾…...
软件测试新方法:利用Lingbot-Depth-Pretrain-ViTL-14进行GUI界面立体元素测试
软件测试新方法:利用Lingbot-Depth-Pretrain-ViTL-14进行GUI界面立体元素测试 你有没有遇到过这种情况?一个软件界面看起来功能都正常,按钮能点,输入框能输,但用起来就是感觉“不对劲”。比如,一个弹窗好像…...
不懂技术也能懂:欧盟PPWR申请通俗版教程。
🧐 第一步:搞懂 PPWR 到底是啥?以前的情况: 欧盟每个国家(德国、法国、意大利等)都有自己的包装法,规则五花八门,你卖到哪个国家就得去哪个国家注册,非常麻烦。现在的 PP…...
从零开始集成cv_resnet101_face-detection_cvpr22papermogface:Git版本控制与团队协作指南
从零开始集成cv_resnet101_face-detection_cvpr22papermogface:Git版本控制与团队协作指南 你是不是也遇到过这种情况?团队里几个人一起折腾一个AI项目,比如这个人脸检测模型。你刚在自己的电脑上把环境配好,代码跑通了ÿ…...
如何破解网易云音乐加密限制?ncmdump让音乐文件自由播放
如何破解网易云音乐加密限制?ncmdump让音乐文件自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否遇到过这样的困扰:从网易云音乐下载的歌曲只能在特定客户端播放,无法在其他设备或播…...
模糊PID vs 传统PID:在Simulink里调直流电机,哪个响应更快更稳?
模糊PID与传统PID的Simulink对决:直流电机控制性能深度评测 在工业自动化和机器人控制领域,直流电机的精准控制一直是工程师们关注的重点。面对日益复杂的控制需求,传统PID控制器虽然简单可靠,但在非线性、时变系统中表现往往不尽…...
AnimateDiff超分辨率展示:SD到HD视频质量提升
AnimateDiff超分辨率展示:SD到HD视频质量提升 1. 引言 当你用AnimateDiff生成了一段视频,却发现画面有些模糊、细节不够清晰时,是不是总觉得有些遗憾?这就是超分辨率技术大显身手的时候了。今天我们来聊聊如何通过超分辨率处理&…...
OpenClaw+千问3.5-9B翻译工作流:PDF双语对照生成
OpenClaw千问3.5-9B翻译工作流:PDF双语对照生成 1. 为什么需要自动化翻译工作流 去年我在研究区块链共识算法时,遇到一个棘手问题:大量前沿论文只有英文版本。手动复制PDF内容到翻译工具,再粘贴回文档排版,不仅效率低…...
Qt项目实战:借助Valgrind精准定位与修复内存泄漏
1. 为什么Qt开发者需要Valgrind 刚接触Qt开发时,我总以为用了智能指针和Qt自带的内存管理机制就能高枕无忧。直到某个深夜,项目上线前突然崩溃,日志里只有一句"segmentation fault",我才意识到内存问题有多可怕。那次经…...



