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

类与对象【中】

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析2

在这里插入图片描述


目录

  • 👉🏻类的默认6个成员函数
  • 👉🏻构造函数
    • 内置类型和自定义类型与默认构造函数的关系
    • 缺省参数和构造函数的配合
  • 👉🏻析构函数

👉🏻类的默认6个成员函数

实际上,我们在声明一个类的时候,编译器会默认生成6个成员函数。
默认成员函数:用户没有显式实现(即自己主动写),编译器会生成的成员函数称为默认成员函数

👉🏻构造函数

🍳概念
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。
🍳特性
构造函数的任务就是用来初始化成员变量

  • ⚡️名字和类名相同
  • ⚡️无返回值
  • ⚡️在实例化对象时自动调用
  • ⚡️允许函数重载
 class Date{public:Date()//无参构造函数{_year = 1;_month = 1;_day = 1;}Date(int year,int month,int day)//有参构造函数{_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};int main(){Date d1;Date d2(2023, 8, 5);return 0;}

这里注意,如果是设置无参构造函数,实例化对象,对象不能单单只给一个().
因为编译器不知道你是声明函数还是声明变量。

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

内置类型和自定义类型与默认构造函数的关系

首先我们先了解下内置类型和自定义类型

内置类型:诸如int、char、double等基本类型,指针全部都是内置类型
自定义类型:class、struct 、union……

默认构造函数:类的对象不需要传参就会自动调用的成员函数。

它们和默认构造函数的关系是什么呢?
默认构造函数对内置类型不进行处理;
默认构造函数会对自定义类型成员调用它的构造函数。
我们举个例子👇🏻👇🏻

 class A1{public:A1(){a = 1;cout << a << endl;}int a;};class A2{public:int b;A1 a1;};int main(){A2 var;cout << var.b << endl;return 0;}

在这里插入图片描述
我们可以看到,对于内置类型b,默认构造函数对其没有处理,所以最后的结果是随机值。
但是a1是自定义类型,它在被实例化对象为var时,默认构造函数自动启动,去调用它本身的构造函数,所以它被初始化了。

但是到这里,我们就会发现,如果我们自己不显现一个构造函数,那么内置类型的变量岂不是全都是随机值?
所以在c++11中,为了补这个坑,可以允许内置类型成员变量在类中声明时可以给默认值

缺省参数和构造函数的配合

无参的构造函数全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。

 class Date{public:Date()//无参构造函数{_year = 1;_month = 1;_day = 1;}Date(int year = 2023,int month = 8 ,int day = 5)//全缺省构造函数{_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};

上述中,有无参构造函数和全缺省构造函数。
在语法上是没错的,因为构造函数允许重载。
但是在实例化对象时会出错。
在这里插入图片描述
因为出现了两个默认构造函数,所以编译器不知道用哪个。
除非这里给了实参,可以让编译器知道用哪个默认构造函数才不会出问题。

🍽如果这里有一个不是全缺省构造函数,则另一个无参构造函数就是唯一的默认构造函数。

 class Date{public:Date()//无参构造函数{_year = 1;_month = 1;_day = 1;}Date(int year ,int month = 8 ,int day = 5)//有参构造函数{_year = year;_month = month;_day = day;}void  Print(){cout << _year<<"/" << _month<<"/" << _day << endl;}private:int _year;int _month;int _day;};int main(){Date d1;d1.Print();return 0;}

在这里插入图片描述

👉🏻析构函数

概念
C++中的析构函数是一种特殊的成员函数,用于在对象被销毁时执行清理操作。析构函数的名称与类名相同,但前面加上一个波浪号(~)。当对象的生命周期结束时(例如,对象超出范围、delete操作符被调用或程序退出),析构函数会自动调用。

析构函数通常是用于释放动态空间上的资源。
特性

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值类型。
  3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。
  5. 与构造函数类似,对内置类型不处理,但会调用自定义类型成员的默认析构函数

注意:创建哪个类的对象则调用该类的析构函数,销毁那个类的对象则调用该类的析构函数

  1. 关于编译器自动生成的析构函数,是否会完成一些事情呢?下面的程序我们会看到,编译器生成的默认析构函数对自定类型成员调用它的析构函数
class Time
{
public:~Time(){cout << "~Time()" << endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本类型(内置类型)int _year = 1970;int _month = 1;int _day = 1;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}

程序运行结束后输出:~Time()在main方法中根本没有直接创建Time类的对象,为什么最后会调用Time类的析构函数?
因为:main方法中创建了Date对象d,而d中包含4个成员变量,其中_year,_month, _day三个是内置类型成员,销毁时不需要资源清理,最后系统直接将其内存回收即可;
而_t是Time类对象,所以在d销毁时,要将其内部包含的Time类的_t对象销毁,所以要调用Time类的析构函数。
但是:main函数 中不能直接调用Time类的析构函数,实际要释放的是Date类对象,所以编译器会调用Date类的析构函 数,而Date没有显式提供,则编译器会给Date类生成一个默认的析构函数
目的是在其内部调用Time 类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁
main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生的默认析构函数

🖐所以,如果类中没有申请资源(申请动态空间)时,析构函数可以不写,直接使用编译器生成的默认析构函数


相关文章:

类与对象【中】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;类的默认6个成员函数&#x1f449;&#x1f3fb;构造…...

uni-app:实现列表单选功能

效果图&#xff1a; 核心解析&#xff1a; 一、 <view class"item_all" v-for"(item, index) in info" :key"index"><view classposition parameter-info text-over :classitem.checked?"checked_parameter":""…...

vue中axios二次封装并发起网络请求配置

1.安装axios npm i axios 2.导入 //对axios进行二次封装 import axios from "axios"// 创建axios实例&#xff0c;其实request就是axiosconst requests axios.create({// 发请求的时候自动出现api// baseURL:"api",// 请求超时的时间timeout:5000, })…...

开源全文搜索引擎汇总

1、Apache Lucene Java 全文搜索框架 许可证:Apache-2.0 开发语言:Java 官网:https://lucene.apache.org/。Apache Lucene 是完全用 Java 编写的高性能、功能齐全的全文检索引擎架构,提供了完整的查询引擎和索引引擎、部分文本分析引擎。目的是为软件开发人员提供一个简单…...

gitlab CI/CD 安装 gitlab runner

一、为什么需要安装gitlab runner &#xff1f; 极狐GitLab Runner 极狐GitLab Runner 是在流水线中运行作业的应用&#xff0c;与极狐GitLab CI/CD 配合运作。 说白了就是你部署的一个agent。 二、如何安装&#xff1f; 1.介绍通过helm部署github runner 2.helm添加仓库 h…...

服务器中了malox勒索病毒后怎么办怎么解决,malox勒索病毒解密数据恢复

服务器遭受Malox勒索病毒攻击后&#xff0c;快速解密并恢复数据至关重要&#xff0c;以便减少更大的经济损失。近期&#xff0c;新的一波malox勒索病毒正在肆虐&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器数据库遭到了malox勒索病毒攻击&#xff0c;导致系统内…...

Python小白学习:超级详细的字典介绍(字典的定义、存储、修改、遍历元素和嵌套)

目录 一、字典简介1.1 创建字典1.2 访问字典中的值1.3 添加键值对1.4 修改字典中的值实例 1.5 删除键值对1.6 由多个类似对象组成的字典1.7 使用get()访问值1.8 练习题 二、遍历字典2.1 遍历所有键值对实例 2.2 遍历字典中的所有键2.3 按照特定顺序遍历字典中的所有键2.4 遍历字…...

word转pdf两种方式(免费+收费)

一、免费方式 优点&#xff1a;1、免费&#xff1b;2、在众多免费中挑选出的转换效果相对较好&#xff0c;并且不用像openOffice那样安装服务 缺点&#xff1a;1、对字体支持没有很好&#xff0c;需要安装字体库或者使用宋体&#xff08;对宋体支持很好&#xff09;2、对于使…...

基于图像形态学处理的目标几何形状检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................... %二进制化图像 Images_bin imbinari…...

python系列教程211——map

朋友们&#xff0c;如需转载请标明出处&#xff1a;https://blog.csdn.net/jiangjunshow 声明&#xff1a;在人工智能技术教学期间&#xff0c;不少学生向我提一些python相关的问题&#xff0c;所以为了让同学们掌握更多扩展知识更好地理解AI技术&#xff0c;我让助理负责分享…...

SW - 3D打印件最好带上浮雕文字标记

文章目录 SW - 3D打印件最好带上浮雕文字标记概述笔记END SW - 3D打印件最好带上浮雕文字标记 概述 做了一些散料飞达的压板, 下了3D打印的单. 一共有10种压板, 每种压板做的数量不等.压板分为2个大的类(中间压板, 边上的压板), 每个类中分了5个子类, 子类之间只是一个高度方…...

Kafka-副本数量设置

1. ISR副本数量设置 指的是存活的副本数量 ISR 机制的另外一个相关参数是 min.insync.replicas , 可以在 broker 或者主题级别进行配置&#xff0c;代表 ISR 列表中至少要有几个可用副本。这里假设设置为 2&#xff0c;那么当可用副本数量小于该值时&#xff0c;就认为整个分…...

解决github打不开的方法

解决github打不开的方法 本文参考文章&#xff1a;解决可ping通但无法访问github网站的问题 一、确定域名github.com的ip地址 进入网址 IP/服务器github.com的信息 - 站长工具 (chinaz.com)&#xff0c;查看 ip 地址。 20.205.243.166 github.com二、确定域名github.global.…...

【云原生】Docker中容器管理常用所有命令

1.docker 容器创建流程 2.容器运行本质 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器基本选项&#xff1a;--name&#xff1a;为容器命名 -i&#xff1a;交互式创建容器 -d&#xff1a;后台创建容器 -t&#xff1a;为容器分配伪终端 Docker 容器存在的意义就是为…...

Flutter video_player点击重新播放

视频播放完成之后&#xff0c;暂停视频&#xff0c;点击重新播放 import package:flutter/material.dart; import package:video_player/video_player.dart;class ListViewItemWidget extends StatefulWidget{overrideState createState() {return _ListViewItemWidgetState()…...

CSS3属性之text-overflow:ellipsis

语法&#xff1a; text-overflow:clip | ellipsis 默认值为clip 不显示省略标记 clip:当前对象内文本溢出时不显示省略标记,而是将溢出部分裁剪。 ellipsis:当对象内文本一处时显示省略标记(...)。 一、常见的单行文本溢出显示省略写法&#xff1a; text-overflow: ellipsis; …...

【深度学习_TensorFlow】梯度下降

写在前面 一直不太理解梯度下降算法是什么意思&#xff0c;今天我们就解开它神秘的面纱 写在中间 线性回归方程 如果要求出一条直线&#xff0c;我们只需知道直线上的两个不重合的点&#xff0c;就可以通过解方程组来求出直线 但是&#xff0c;如果我们选取的这两个点不在直…...

C++使用 auto 自动推断类型

C使用 auto 自动推断类型 在有些情况下&#xff0c; 根据赋给变量的初值&#xff0c; 很容易知道其类型。 例如&#xff0c; 如果将变量的初值设置成了 true&#xff0c;就可推断其类型为 bool。如果您使用的编译器支持 C11 和更高版本&#xff0c;可不显式地指定变量的类型&a…...

【前端面试手撕题】call、bind、new、freeze、浅拷贝

FED11 _call函数 描述 请补全JavaScript代码&#xff0c;要求实现Function.call函数的功能且该新函数命名为"_call"。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><style>/* 填写样式 */</style> </head…...

MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容测评

今天给大家带来了 MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容 100 挑战赛 的视频&#xff0c;现在充电头再以文章的形式呈现给大家&#xff0c;让大家更清楚、直白的了解这款笔记本在升级系统后的兼容性如何。 MacBook Pro 16 M1 Max 配置了 140W 的 MagSafe 充电口&…...

全志D1s开发板RT-Smart环境搭建:从工具链到烧录的完整实践指南

1. 项目概述与核心价值最近在折腾一块搭载了全志D1s芯片的开发板&#xff0c;目标是在上面跑RT-Smart实时操作系统。这听起来像是一个标准的嵌入式开发流程&#xff0c;但实际操作下来&#xff0c;从环境搭建到第一个程序跑起来&#xff0c;中间踩的坑一个接一个&#xff0c;远…...

利用Taotoken多模型能力为AIGC应用动态选择最佳模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用Taotoken多模型能力为AIGC应用动态选择最佳模型 在构建内容生成类应用时&#xff0c;开发者常常面临一个核心挑战&#xff1a;…...

FL Studio自带的Edison插件,才是隐藏的降噪神器!手把手教你清除录音底噪(含参数设置避坑指南)

FL Studio隐藏神器Edison&#xff1a;专业级降噪全流程实战指南 在家庭录音棚里&#xff0c;空调的嗡嗡声、电脑风扇的呼啸、电路底噪的嘶嘶声——这些不受欢迎的"伴奏"总是如影随形。当你在FL Studio中回放刚录制的人声或乐器时&#xff0c;这些背景噪音往往会毁掉整…...

AES128加密实战:用C语言写一个加密函数,并集成到你的STM32项目里

AES128加密实战&#xff1a;用C语言写一个加密函数&#xff0c;并集成到你的STM32项目里 在物联网设备开发中&#xff0c;数据安全传输是至关重要的环节。想象一下&#xff0c;你的STM32设备需要通过无线网络发送传感器数据到云端&#xff0c;如果这些数据以明文传输&#xff0…...

RK3568扩展模块实战:4G/Wi-Fi 6/多串口集成与Linux驱动适配

1. 项目概述&#xff1a;当“小”模块遇上“大”平台最近在折腾一块瑞芯微的RK3568开发板&#xff0c;这板子性能不错&#xff0c;四核A55加上独立的NPU&#xff0c;做边缘计算、多媒体网关或者轻量级服务器都挺合适。但在实际项目落地时&#xff0c;我遇到了一个几乎所有硬件开…...

OBS面部追踪插件终极指南:3分钟实现智能直播自动对焦

OBS面部追踪插件终极指南&#xff1a;3分钟实现智能直播自动对焦 【免费下载链接】obs-face-tracker Face tracking plugin for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-face-tracker 在直播和视频录制中&#xff0c;你是否经常需要手动调整摄像头…...

Perplexity查不出薛定谔方程推导?紧急修复指南:4步重置知识图谱权重,实测响应准确率从62%→98.7%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity物理知识查询 Perplexity 是一款基于大语言模型的实时网络增强型问答工具&#xff0c;其在物理知识查询场景中展现出独特优势&#xff1a;它能动态检索权威物理数据库&#xff08;如NIST、ar…...

深入理解 ASP.NET Core 中的 IActionResult

一、从一个问题开始 你写了一个 Web API&#xff0c;有时候要返回数据&#xff0c;有时候要返回 404&#xff0c;有时候要返回 400——这三种情况的返回值类型完全不同&#xff0c;一个 C# 方法怎么能同时返回多种东西&#xff1f; 这就是 IActionResult 存在的根本原因。它的本…...

别再复制粘贴了!手把手教你用C语言实现MODBUS CRC-16校验(附5种算法对比)

MODBUS CRC-16校验算法实战指南&#xff1a;从原理到最优实现选择 在工业自动化领域&#xff0c;MODBUS协议因其简单可靠而广泛应用&#xff0c;而CRC-16校验则是保障数据完整性的关键环节。许多开发者习惯直接复制网络上的校验代码&#xff0c;却常常遇到内存溢出、性能瓶颈或…...

Sunshine终极指南:8步搭建你的个人游戏串流服务器

Sunshine终极指南&#xff1a;8步搭建你的个人游戏串流服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上流畅玩PC游戏吗&#xff1f;Sunshine是一款免费开源…...