当前位置: 首页 > news >正文

c++------类和对象(下)包含了this指针、构造函数、析构函数、拷贝构造等

文章目录

  • 前言
  • 一、this指针
    • 1.1、this指针的引出
    • 1.2、 this指针的特性
  • 二、类的默认的六个构造函数
    • 2.1、构造函数简述
    • 2.2构造函数
  • 三、析构函数
    • 3.1、析构函数引出
    • 3.2、特点:
  • 四、拷贝构造
    • 4.1、引入
    • 4.2、特征:
    • 4.3、默认拷贝构造函数
  • 总结


前言

在本节中,我将给大家介绍我们在学习C++中经常要用到的,this指针、类的六个默认成员函数、运算符重载等相关知识.

下面我会结合一个简单的类----日期类来介绍

后面需要时会补充相应的成员函数

class Date
{
public:void Display()//打印类对象中的内容{cout << _year << "-" << _month << "-" << _day << endl;}void SetDate(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year; // 年int _month; // 月int _day; // 日
};

一、this指针

1.1、this指针的引出

int main(){Date d1, d2;d1.SetDate(2024,5,1);d2.SetDate(2024,6,1);d1.Display();d2.Display();return 0;}

当执行上述代码时,它的输出结果为:
在这里插入图片描述
下面的汇编不了解的,可以搜一下栈帧的创建和销毁,对今后的学习帮助很大
在这里插入图片描述

通过汇编我们可以看到,两次调用的SetDat函数地址相同(调用同一函数)

对于上述类,有这样的一个问题:
Date类中有SetDate与Display两个成员函数,函数体中没有关于不同对象的区分,那当d1调用SetDate函数时,该函数是如何知道应该设置s1对象,而不是设置d2对象呢?

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

1.2、 this指针的特性

  1. this指针只能在“成员函数”的内部使用
  2. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。
  3. this指针是成员函数第一个隐含的指针形参,不需要用户
    传递.

将调用成员函数展开:
在这里插入图片描述

下面我们来证明一下this指针,本质上就是对象的地址:

为了更清晰的展示,我会简化用不到的代码

class Date
{
public:void Print_this(){cout << this << endl;//打印this指针}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{Date d1, d2;d1.Print_this();//cout << &d1 << endl;//如果和我们说的一样,那么打印结果应该两两相同d2.Print_this();cout << &d2 << endl;return 0;
}

结果:
在这里插入图片描述
可以看到this本质就是对象的地址。这就是隐藏的this指针,当然我们可以像学习C语言时知道一个结构体对象的地址使用“->”来进行成员变量的访问

class Date{public:void Display(){cout <<this-> _year << "-" <<this-> _month << "-" << this->_day << endl;}private:int _year; // 年int _month; // 月int _day; // 日};

二、类的默认的六个构造函数

在这里插入图片描述

恩师莫怪

2.1、构造函数简述

如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,编译器都会自动生成6个默认成员函数。这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。
构造函数特点:

1.构造函数的名字和类名相同。
2.和其他函数不一样的是,构造函数没有返回类型。
3.类似于其他的函数,构造函数也有一个(可能为空的)参数列表和一个(可能为空的)函数体。
4.构造函数不能被声明成const 的。

需要特别注意的是,一个类可以拥有多个参数不同的构造函数,这些构造函数之间,向普通函数之间一样,可以构成函数重载

2.2构造函数

再贴一遍方便大家看

class Date
{
public:void Display()//打印类对象中的内容{cout << _year << "-" << _month << "-" << _day << endl;}void SetDate(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year; // 年int _month; // 月int _day; // 日
};

对于Date类,可以通过SetDate公有的方法给对象设置内容,但是如果每次创建对象都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?我们上面说过:创建类的类型对象时由编译器自动调构造函数,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。

class Date
{
public:// 1.无参构造函数Date(){}// 2.带参构造函数Date(int year, int month, int day)//无返回值{_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
void TestDate()
{Date d1; // 调用无参构造函数Date d2(2024, 6, 1); // 调用带参的构造函数,用于初始化// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明// 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象Date d3();

如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
1.证明编译器默认生成的为无参的构造函数:

在这里插入图片描述

可以看到,我将自己写的构造函数屏蔽后,调用有参的构造函数是无法成功的,无参的并没有报错,这也说明编译器默认生成的为无参的构造函数。
2.证明当我们显示写出一个构造函数,编译器就不会在生成默认的构造函数:
在这里插入图片描述

我将带参的构造函数显示定义,d1无法调用无参的默认构造函数。
无参的构造函数和全缺省的构造函数都称为默认构造函数,并且这两个默认构造函数不能同时存在。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数.

默认构造函数我们一般是为了处理自定义类型的成员变量

三、析构函数

3.1、析构函数引出

前面通过构造函数的学习,我们知道一个对象时怎么来的,那一个对象又是怎么没呢的?
析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作(比如:类中定义的指针指向的空间的清理)

3.2、特点:

  1. 析构函数名是在类名前加上字符 ’~‘。
  2. 无参数无返回值。
  3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数
![class Date
{
public:~Date(){_year = 0;_month = 0;_day = 0;} Date(int year, int month, int day){_year = year;_month = month;_day = day;}int _year;int _month;int _day;
};
int main()
{Date d2(2024, 6, 1);return 0;
}

反汇编视角:
在这里插入图片描述

在上面的代码中,我并没有去显示调用析构函数,但是在程序执行结束时,编译器自动调用了,析构函数
这个也可以像构造函数一样测试,大家尝试一下

四、拷贝构造

4.1、引入

拷贝构造函数是构造函数的一种重载形式,它可以用来创建一个与已存在的对象一模一样的新对象。对于拷贝构造,它只有单个形参,且该形参必须是对本类类型对象的引用,因为要引用,所以要加const修饰。

4.2、特征:

1.拷贝构造函数的参数若使用传值方式编译器直接报错, 因为会引发无穷递归调用
2.若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数,对对象按 字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。
3.编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了。

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1)//全缺省{_year = year;_month = month;_day = day;}// Date(const Date d)   // 错误--引发无穷递归Date(const Date& d)   // 正确写法_year = d._year;_month = d._month;_day = d._day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2(d1);//也可以写成Date d2=d1return 0;
}

4.3、默认拷贝构造函数

像上面介绍的默认成员函数一样,当我们没有在类中写拷贝构造函数时,编译器会自动生成一个默认的拷贝构造。

系统生成的拷贝构造也会针对成员变量的内置类型和自定义类型做一个区分。对于内置类型的成员变量,编译器会按照被拷贝对象的内存存储字节序完成拷贝,就好比被拷贝的对象有3个int类型成员变量,占12字节内存,编译器会根据该对象的内存和成员初始值拷贝给新对象。

总结

本次我们介绍了,this指针、构造函数、析构函数、拷贝构造、等一些与类紧密关联的知识。
要将他们详细的介绍,所用篇幅过长,后续会出拓展版的

相关文章:

c++------类和对象(下)包含了this指针、构造函数、析构函数、拷贝构造等

文章目录 前言一、this指针1.1、this指针的引出1.2、 this指针的特性 二、类的默认的六个构造函数2.1、构造函数简述2.2构造函数 三、析构函数3.1、析构函数引出3.2、特点&#xff1a; 四、拷贝构造4.1、引入4.2、特征&#xff1a;4.3、默认拷贝构造函数 总结 前言 在本节中&a…...

git版本控制工具常用命令

一、本地仓库管理 push 向远程推送代码 pulll 拉取代码 二、远程仓库管理 三、分支操作 本地主分支master 远程主分支main head指向当前分支 查看&#xff1a;git branch 创建分支: git branch 名字 切换分支&#xff1a;git checkout 名字 合并分支&#xff1a;git…...

展示广告多模态召回模型:混合模态专家模型

✍&#x1f3fb; 本文作者&#xff1a;俊广、卓立、凌潼、青萤 1. 背景 随着在搜索、推荐、广告技术上多年的迭代积累&#xff0c;业界逐步形成了召回&#xff08;匹配&#xff09;、粗排、精排这一多阶段的系统架构。其中&#xff0c;召回作为链路的最前端&#xff0c;决定了业…...

好的一些网安资源

镜像&#xff1a;https://msdn.itellyou.cn/ 编程学习{ 菜鸟教程&#xff1a;https://www.runoob.com/ w3school&#xff1a;https://www.w3school.com.cn/ https://www.dotcpp.com/ http://zh.cppreference.com/ https://beginnersbook.com/ https://www.ai8py.com/ }…...

Linux chmod 命令

Linux chmod 命令 在 Linux 操作系统中&#xff0c;chmod 命令是非常重要的。它可以用于修改文件和目录的访问权限&#xff0c;以及控制用户对系统资源的访问。在这篇博客中&#xff0c;我们将深入探讨 chmod 命令的使用方法&#xff0c;以及如何使用它来管理文件和目录的访问…...

SDL教程(二)——Qt+SDL播放器

前言 ​ 这篇文章主要是使用SDL来打开视频&#xff0c;显示视频。后续会再继续使用SDL来结合FFmpeg。来能够直接使用网上的demo进行学习。 正文 一、环境 Qt 5.15.2 MSVC2019 64bit Win11 二、Qt搭建SDL Qt搭建&#xff0c;我觉得相比用VS2019来说&#xff0c;更为方便&…...

Java面试题:解决Redis缓存击穿问题

缓存击穿 当一个key过期时,需要对这个key进行数据重建 在重建的时间内如果有大量的并发请求进入,就会绕过缓存进入数据库,会瞬间击垮DB 重建时间可能因为数据是多个表的混合结果需要分头统计而延长,从而更容易出现缓存击穿问题 缓存击穿的解决方案 添加互斥锁 先查询缓存…...

Redis的哨兵模式

什么是哨兵模式 Redis的哨兵模式&#xff08; Sentinel mode &#xff09;是⼀个⾼可⽤解决⽅案&#xff0c;当运⾏多个 Redis 实例并且需要⾃动故障转移时&#xff0c;哨兵模式⾮常有⽤。 在⼀个典型的哨兵模式下&#xff0c;⾄少需要3 个哨兵实例来避免 “ 脑裂 ” &#xff…...

Hadoop伪分布式安装教程

Hadoop伪分布式安装教程 一、安装背景1.1 软件列表1.2 系统软件列表 二、安装Hadoop2.1 安装 Java 环境2.1.1 前期准备2.1.2 文件传输2.1.3 解压文件2.1.4 配置 jdk 的环境变量2.1.5 输入 java、javac、java -version 命令检验 jdk 是否安装成功 2.2 Hadoop 下载地址[hadoop](h…...

Day43 代码随想录打卡|二叉树篇---左叶子之和

题目&#xff08;leecode T404&#xff09;&#xff1a; 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 方法&#xff1a; 迭代法&#xff1a;计算所有的左叶子节点&#xff0c;那我们就必然要找到所有的左叶子节点。那么怎么找呢&#xff1f;如何针对cur->l…...

微信小程序动画

微信小程序动画属性&#xff1a;提升用户体验的利器 引言 随着移动互联网技术的快速发展&#xff0c;微信小程序已经成为开发者和用户的热门选择。其轻便、快捷、即用即走的特点使得它在各种场景中都有广泛的应用。而动画作为一种重要的视觉元素&#xff0c;在增强用户体验方…...

js, ellipsis属性, 超出宽度自动省略... , 并且显示2行

overflow:hidden; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; text-overflow:ellipsis;...

ucharts自定义添加tooltip悬浮框显示项内容且换行

欢迎点击领取 -《前端开发面试题进阶秘籍》&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 一、需求描述分析 1、小程序上实现图表的绘制&#xff0c;多条线路&#xff0c;不同颜色&#xff0c;悬浮框对应内容不同数据进行处理 2…...

Mongo 地理位置查询:海量密集点转换成聚合信息

通俗来说&#xff1a;将地图上的海量密集点通过网格分割的方式实现聚合&#xff1b; 需求&#xff1a;用mongo实现设备地理位置聚合查询 &#xff1a;多边形&#xff0c;矩形查询; 背景&#xff1a;上万设备数据量 目的&#xff1a;分享Mongo地理位置查询&#xff0c;以及文…...

bpmn+vue 中文文档

1.初始化项目 <script> import BpmnModeler from bpmn-js/lib/Modeler import { xmlStr } from /mock/xmlStr export default {mounted () {this.init()},methods: {init () {// 获取到属性ref为“canvas”的dom节点const canvas this.$refs.canvas// 建模const custom…...

React Router v5 和 v6 中,路由对象声明方式有什么区别?

一、在React Router 6.x开始&#xff0c;路由对象的声明需要引用RouteObject。 import { RouteObject } from react-router-dom;const routes: RouteObject[] [{path: /,element: <Home />},{path: /about,element: <About />},// ... ];二、一些老项目使用的是R…...

【全开源】知识库文档系统(ThinkPHP+FastAdmin)

&#x1f4da;知识库文档系统&#xff1a;解锁知识的无限可能 一款基于ThinkPHPFastAdmin开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&a…...

Python赋能自然语言处理,解锁通往AI的钥匙

NLTK&#xff08;Natural Language Toolkit&#xff09;是一个用于 Python 的自然语言处理库,提供了丰富的工具和资源,帮助处理、分析和理解人类语言数据.它广泛应用于学术研究、教育和商业应用中. 安装 #首先要安装 NLTK&#xff1a;pip install nltk安装完成后,还需要下载…...

Ktor库的高级用法:代理服务器与JSON处理

在现代网络编程中&#xff0c;Ktor是一个高性能且易于使用的框架&#xff0c;它提供了对异步编程、WebSockets、HTTP客户端和服务器等特性的原生支持。Ktor是使用Kotlin语言编写的&#xff0c;充分利用了Kotlin的协程特性来简化异步编程。本文将深入探讨Ktor库的高级用法&#…...

VS2017配置OpenCV4.5.1

VS2017配置OpenCV 一、下载OpenCV二、配置OpenCV的电脑环境变量三、配置visual Studio添加路径复制文件到C盘 四、如何使用注意运行时选择Debug x64 五、报错&#xff1a;VSOpencv出现&#xff1a;xxx处有未经处理的异常: Microsoft C 异常: cv::Exception&#xff0c;位于内存…...

phpstudy配置的站点不能访问了

无法打开站点 打开网站的时候出现如下 没有人为主动去更改配置项&#xff0c;今天就不能正常访问了 检查了一遍配置&#xff0c;发现并无大碍&#xff0c;那就重新配置一遍看看 配置phpstudy 1、新建网站 2、选择项目入口文件夹 3、配置伪静态 4. 确认保存 在我的电脑 C:\…...

Java Web学习笔记2——Web开发介绍

什么是Web&#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网&#xff08;WWW World Wide Web&#xff09;&#xff0c;能够通过浏览器访问的网站。 1&#xff09;淘宝、京东、唯品会等电商系统&#xff1b; 2&#xff09;CRM、OA、ERP企业管理系统&#xff1…...

从零开始实现自己的串口调试助手(3) - 显示底部收发,优化串口打开/关闭

注意: 1. 我们要实现自发自收&#xff0c;要将tx&#xff0c;rx连起来 2.发送的 不能是中文符号&#xff0c;因为这可能导致&#xff0c;读取到的是英文符号 --> 导致接收到的size 和发送的size 大小不一致 3.注意同时定义两个槽函数的时候两个槽函数都会被调用&#xff0c;…...

更改Web网站设计——css和css框架

虽然使用HTML可以定义文章的结构&#xff0c;但是其中不包含设计相关的信息。此时CSS就派上用场&#xff0c;可以用它对HTML文章指定设计样式。由于可以决定Web网页的外观风格&#xff0c;因此&#xff0c;它有时也被称为格式表。 如果使用CSS设置背景色&#xff0c;文…...

持续监控和优化的简单介绍

DevOps 监控提供了有关生产环境状况的全面且最新的信息&#xff0c;以及有关其服务、基础设施和应用程序的详细信息。通过从日志和指标中收集数据&#xff0c;您可以在软件开发生命周期的每个步骤中监控合规性和性能。 监控不仅仅针对生产问题&#xff0c;它涵盖了规划、开发、…...

针对硅基氮化镓高电子迁移率晶体管(GaN-HEMT)的准物理等效电路模型,包含基板中射频漏电流的温度依赖性

来源&#xff1a;Quasi-Physical Equivalent Circuit Model of RF Leakage Current in Substrate Including Temperature Dependence for GaN-HEMT on Si&#xff08;TMTT 23年&#xff09; 摘要 该文章提出了一种针对硅基氮化镓高电子迁移率晶体管&#xff08;GaN-HEMT&…...

基于websocket与node搭建简易聊天室

一、前言 上一篇文章介绍了websocket的详细用法与工具类的封装&#xff0c;本篇就基于websocket搭建一个简易实时的聊天室。 在本篇开始之前也可以去回顾一下websocket详细用法&#xff1a;WebSocket详解与封装工具类 二、基于node搭建后台websocket服务 首先确认本机电脑中…...

DevOps全面综述:从概念到实践

一、背景与概述 1.1 DevOps的起源与发展 DevOps&#xff08;Development and Operations的缩写&#xff09;是软件工程领域中的一种文化和实践方法&#xff0c;旨在促进开发团队与运维团队之间的协作&#xff0c;从而实现更高效、更可靠的软件交付。DevOps起源于敏捷软件开发方…...

[C++]vector的模拟实现

下面是简单的实现vector的功能&#xff0c;没有涉及使用内存池等复杂算法来提高效率。 一、vector的概述 &#xff08;一&#xff09;、抽象数据类型定义 容器&#xff1a;向量&#xff08;vector&#xff09;vector是表示大小可以变化的数组的序列容器。像数组一样&#xf…...

【云原生】Kubernetes----POD控制器

目录 引言 一、Pod控制器概述 二、Pod控制器的种类 &#xff08;一&#xff09;ReplicaSet &#xff08;二&#xff09;Deployment &#xff08;三&#xff09;StatefulSet &#xff08;四&#xff09;DaemonSet &#xff08;五&#xff09;Job 三、使用POD控制器 &a…...

自己做本地网站/企业网站制作与维护

今天&#xff0c;男友转发了一条我曾经发给他的短信息。看着短信里的文字&#xff0c;那时的感受宛如重现&#xff0c;是那么的真切。而我自从来到他的身边&#xff0c;不再异地&#xff0c;思念的情感不再&#xff0c;就连幸福的感觉也被忽视。此时此刻&#xff0c;我真正体会…...

h5自助建站系统/郑州网站建设优化

北京时间2017年6月14日&#xff0c;为期三天的第九届中国云计算大会在北京国家会议中心拉开序幕。本届大会以“生态构建 深化应用”为主题&#xff0c;重点围绕云计算大数据的产业生态完善、技术与传统产业的深度融合&#xff0c;以及云计算大数据技术与物联网、人工智能等最新…...

在线响应式网站/高清视频线转换线

序言 我们之前获取了Mybatis的源码&#xff0c;并且搭建了调试环境&#xff0c;其实Mybatis框架&#xff08;市面上的大部分持久层框架&#xff09;都是对JDBC做封装的。作为一名合格的程序员&#xff08;非CV操作员&#xff09;&#xff0c;都必须对JDBC肯定是熟悉的&#xf…...

广州番禺服装网站建设/电商的运营模式有几种

今天在看hibernate视频时&#xff0c;看到视频上人家的hibernate.cfg.xml配置文件在配置hibernate方言时&#xff0c;发现视频上是这样写的<property name"dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>&#xff0c;结果我也是那样写&a…...

b2b还是自己做网站/外链链接平台

BZOJ_2017 一个思路就是从游戏结束开始向前dp&#xff0c;dp到最初状态时自然就知道最大能得到多少钱了&#xff0c;但是从后向前dp有一个问题就是需要直到前一步对方拿了多少硬币&#xff0c;才能知道当前能拿多少&#xff0c;因此用一维标记一下前一步对方拿了多少即可&#…...

微信优惠券网站怎么做/解释seo网站推广

CSS3:position 取值&#xff1a;static:无特殊定位&#xff0c;对象遵循正常文档流。top,right,bottom,left等属性不会被应用。 relative:对象遵循正常文档流&#xff0c;但将依据top&#xff0c;right,bottom,left等属性在正常文档流中偏移位置 absolute:对象脱离正常文档流&a…...