[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.我们观察一下我们实现队列的默认构造和默认析构:

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打卡go学习第一天

8.1 下面展示一些 代码。 package mainimport ("fmt""net""os""time" )type Clock struct {Name stringAddr string &#xff5d; func main() {clocks : []Clock{{Name: "New York", Addr: "localhost:8000"…

基于深度学习网络的蔬菜水果种类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1数据集准备 4.2构建深度学习模型 4.3模型训练 4.4模型评估 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; wa…

如何更换微信公众号主体?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不止局限…

CAD Exchanger SDK 3.22.0 Crack

Docker 映像、Autodesk Inventor 2022 支持以及从 CAD Exchanger 3.22.0 中的 CATIA 导入属性 使用 Docker 映像将您的软件运送到任何地方&#xff0c;独立于 Autodesk 软件读取 .ipt、.iam 文件&#xff0c;从 CATIA 探索机械、产品和自定义属性。 软件开发工具包产品更新发明…

使用 Rust 开发:以太坊与 Layer2 生态建设新趋势

Rust 是一种系统编程语言&#xff0c;以其出色的性能、内存安全和并发性而闻名&#xff0c;在区块链和 Web3 中广泛应用&#xff0c;大多数编程语言和开发框架都以 Rust 为核心&#xff0c;如 Polkadot、Solana、NEAR、Elrond&#xff08;现名 MultiversX&#xff09;、Hyperle…

华为云文件上传(单个上传和分段上传)

首先引入静态文件&#xff1a; 华为云官网提供js下载的链接 然后后端提供一个公用接口&#xff0c;返回华为云上传的基本配置&#xff1a; 官网提供的链接&#xff1a;华为云obs信息配置 一&#xff1a;单个上传 huaweiyunUpload (file, fileName, name, url, size, callb…

13.3测试用例进阶

一.测试对象划分 1.界面测试(参考软件规格说明书和UI视觉稿) a.什么是界面 1)WEB站(浏览器) 2)app 3)小程序 4)公众号 b.测试内容 1)界面内容显示的一致性,完整性,准确性,友好性.比如界面内容对屏幕大小的自适应,换行,内容是否全部清晰展示. 2)验证整个界面布局和排版…

设计模式_中介者模式

中介者模式 介绍 设计模式定义案例问题堆积在哪里解决办法中介者代替了多个对象之间的互动 使对象1 2 3 之间的互动 变为&#xff1a; 对象1->中介 对象2->中介 对象3->中介好友之间 约饭好友1 通知 好友2 -3 -4 等等加一个群 谁想吃饭就 通知一下 类图 代码 角色 …

【ROS 2 Humble】 Ubuntu 20.04(Focal)平台 源码安装

提问链接&#xff1a; https://answers.ros.org/questions/ —————————————— ROS 1 各版本支持截止时间查看 ROS 1 支持时间查看 链接 https://wiki.ros.org/Distributions ROS 2 各版本支持截止时间查看 ROS 2 版本支持时间查看 ROS 2 https://docs.ros.…

element-ui中表格树类型数据的显示

项目场景&#xff1a; 1&#xff1a;非懒加载的情况 1&#xff1a;效果展示 2&#xff1a;问题描述以及解决 1&#xff1a;图片展示 2&#xff1a;html <-- default-expand-all 代表默认展开 如果不展开删除就行 --> <el-tableref"refsTable"v-loadin…

高速DSP系统设计参考指南(六)锁相环(PLL)

&#xff08;六&#xff09;锁相环&#xff08;PLL&#xff09; 1.模拟锁相环2.数字锁相环3.PLL隔离技术 系统设计人员需要隔离PLL&#xff0c;使其免受内部和外部噪声的影响。PLL通常用作频率合成器&#xff0c;将输入时钟乘以一个整数。该整数是反馈计数器M除以输入计数器N的…

Pytorch搭建DTLN降噪算法

前面介绍了几种轻量级网路结构的降噪做法&#xff0c;本文介绍DTLN—一种时频双核心网络降噪做法。 AI-GruNet降噪算法 AI-CGNet降噪算法 AI-FGNet降噪算法 Pytorch搭建实虚部重建AI-GruNet降噪算法 一、模型结构 DTLN来自[2005.07551] Dual-Signal Transformation LSTM N…

EPLAN_008#3D布局图

一、新建页 多线原理图纸画好以后 打开布局空间导航器——右键——新建 二、插入箱柜 菜单栏——插入——箱柜 三、显示安装板 然后调整视角 四、插入线槽 菜单栏——插入——线槽——选择合适的线槽——确定 按A键可以切换线槽方向&#xff0c;如果位置不对&#xff0c;可以再…

尝试使用jmeter-maven-plugin

前提准备 1、maven项目 2、已安装JMeter、Jenkins、maven、jdk 环境要求&#xff1a; jmeter>5.6.2 maven >3.9 jdk>1.8 Jenkins ? 备注&#xff1a;jmeter-maven-plugin 无需下载&#xff0c;可查阅相关地址&#xff1a;GitHub - jmeter-maven-plugin/jmete…

高效恢复丢失的文件的10 款Android数据恢复工具

在当今快节奏的数字时代&#xff0c;从Android设备丢失重要数据可能是一场噩梦。 您需要一个可靠的恢复工具来取回您的数据&#xff0c;例如令人难忘的照片&#xff0c;重要的联系人&#xff0c;重要的工作文档等。 值得庆幸的是&#xff0c;有许多高效的Android数据恢复工具可…

什么是无磁远传水表?工作原理是怎样的?

无磁远传水表是一种新型的智能水表&#xff0c;与传统水表相比&#xff0c;它具有更高的精度和可靠性&#xff0c;并且可以实现远程读数和控制。那么&#xff0c;无磁远传水表的工作原理是怎样的呢?下面&#xff0c;小编来为大家介绍下什么是无磁水表?它的工作原理是怎样的&a…

npm ERR! node-sass@6.0.1 postinstall: `node scripts/build.js`

1.遇到的问题 vue npm install提示以下错误 2.首次尝试方法 尝试用下面的方式重新安装弄得-saas&#xff0c;结果不起作用 。 npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass npm install node-sass 这时考虑降级node版本&#xff0c;node.js从…

【树莓派触摸屏等学习笔记】

前言 树莓派触摸屏 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、触摸屏硬件驱动 出现黑屏的时候&#xff0c;恢复一下txt config.txt 全屏显示 showFull Exec &#xff1a;自启动 surf 算法 特征点识别 算法的复杂度挺高的 特性树莓派强大…

N-128基于springboot,vue酒店管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis 本系统功…

怎么恢复移走的u盘数据?可以尝试这三种方法

当意外移走U盘上的数据时&#xff0c;我们常常会感到焦虑和失望&#xff0c;特别是当这些数据对我们仍然重要时。不过&#xff0c;您不必完全放弃&#xff0c;因为本文将介绍一些方法&#xff0c;以帮助您恢复U盘上的重要数据。 图片来源于网络&#xff0c;如有侵权请告知 移走…