类和对象中阶1⃣️-默认成员函数(构造函数 析构函数)

目录

1.类的6个默认成员函数

2.构造函数

2.1 概念

3.析构函数

3.1 概念

3.2 特性


1.类的6个默认成员函数

如果一个类中什么成员都没有,简称为空类。

空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数

默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数

class Date{};

2.构造函数

2.1 概念

构造函数是特殊的成员函数,需注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。

其特征如下:

  1. 函数名与类名相同。
  2. 无返回值
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载
class Date{
public:
//1.无参构造函数
Date(){_year = 0;_month = 0;_day = 0;
}//2.带参构造函数
Date(int year,int month,int day){_year = year;_month = month;_day = day;
}//通常将无参构造和带参构造结合成一个 全缺省void Print(){cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
}
private:
int _year;
int _month;
int _day;
};void TestDate(){Date d1;//调用无参构造Date d2(2024,2,9);//调用带参构造函数d1.Print();d2.Print();
}//注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
//也就是这种方式是错误的 Date d3();int main(int argc, const char * argv[]) {TestDate();return0;
}
  1. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义,编译器将不再生成。
  2. 默认构造函数不会对内置类型做任何改变,但是对于自定义类型来说,会调用自定义类型的构造函数。但是在,C++11 中针对内置类型成员不初始化的缺陷,内置类型成员变量在类中声明时可以给默认值

ps:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int /char...,自定义类型就是我们使用class/struct/union等自己定义的类型。

class A
{
public:A()
{_a = 0;
}private:
int _a;
};class Time{public:Time(int hour){cout<<"Time()"<<endl;_hour = hour;_minute = 0;_second = 0;
}private:
int _hour;
int _minute;
int _second;
A aa;//自定义类型aa;调用Time()时,会自动调用A()构造函数
//自定义类型调用默认构造函数
};int main(int argc, const char * argv[]) {Time d3(3);return0;
}

  1. 无参的构造函数全缺省的构造函数都被称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。
class Time{
public:Time(){//无任何参数的也称为默认构造函数_hour = 0;_minute = 0;_second = 0;}//有参但不是缺省参数的构造函数重载Time(int hour){cout<<"Time()"<<endl;_hour = hour;_minute = 0;_second = 0;}private:int _hour = 9;int _minute = 8;int _second = 7;//内置类型成员变量在类中声明时可以给默认值};int main(int argc, const char * argv[]) {Time d1;//不写参数时调用无参构造,不给参数时不用写括号,否则编译器将无法辨认是函数声明是实例化Time d2(9);//有参构造函数调用return 0;
}输出结果:
无参构造函数调用
有参构造函数调用
0 0 0
9 0 0
class Date
{
private:
//内置类型没有规定要处理(可处理,可不处理,看编译器)int _day;int _month;int _year;
public:Date(){//无任何参数的也称为默认构造函数cout << "无参构造函数调用" << endl;}//全缺省默认构造函数Date(int year = 2024, int month = 3, int day = 20){_year = year;_month = month;_day = day;}void print(){cout << _year << "-" << _month << "-" << _day << endl;}
};int main(int argc, const char * argv[]) {Date d;//不写参数时调用无参构造以及编译器自动生成的构造d.print();return 0;
}
报错:Call to constructor of 'Date' is ambiguous
编译器不知道调用哪一个

实践中总结:

  1. 一般情况构造函数都需要我们自己显示的去实现
  2. 只有少数情况下可以让编译器自动生成构造函数,类似MyQueue,成员全是自定义类型

3.析构函数

3.1 概念

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

3.2 特性

析构函数是特殊的成员函数,其特征如下:

  1. 析构函数名是在类名前加上字符~。
  2. 无参数无返回值类型。
  3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载。
  4. 对象生命周期结束时,C++编译系统自动调用析构函数
typedef int DataType;class Stack{
private:DataType* _array;int _capacity;int _size;public:Stack(size_t capacity = 3){//全缺省构造函数_array = (DataType*)malloc(sizeof(DataType)*capacity);if(_array == nullptr){perror("malloc fail");}_capacity = capacity;_size = 0;}void Push(DataType x){_array[_size++] = x;}//...其他方法~Stack(){		//析构函数,结束时自动调用if(_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}};void TestStack(){Stack s;s.Push(1);s.Push(2);
}int main(int argc, const char * argv[]) {TestStack();return 0;
}

5. 对于编译器生成的默认析构函数,不处理内置类型,对自定义类型成员调用它的析构函数,与构造函数自定义类型调用默认构造函数相同

class Time
{
private:int _time;
public:Time()//无参构造函数{_time = 0;}~Time()//析构函数{}
};class Date
{
private:int _day;int _month;int _year;Time _t; //自定义类型
public:Date(int day = 20, int month = 3, int year = 2024)//全缺省构造函数{_day = day;_month = month;_year = year;}};int main()
{Date d;return 0;
}

6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数;有资源申请时,一定要写,否则会造成内存泄漏

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

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

相关文章

JavaThread线程

目录 程序--进程--线程 程序&#xff1a; 进程&#xff1a; 线程&#xff1a; 进程和线程的关系 创建线程 单线程模式 代码 图解 运行 代码 运行 创建线程 方式一 代码 运行 方式二 代码 运行 总结&#xff1a; Thread类中常用的方法 1、 代码 运行…

电脑剪切复制到u盘文件丢失怎么办?未备份者的应急指南

在日常生活和工作中&#xff0c;我们经常使用电脑和U盘进行文件的传输和备份。然而&#xff0c;在剪切复制文件到U盘的过程中&#xff0c;有时可能会遇到文件丢失或无法找到的问题&#xff0c;而这时又没有备份&#xff0c;这无疑让人头疼不已。那么&#xff0c;面对这种情况&a…

java的aop实现方式

java的aop可以通过三种方式来实现 1.使用ajc编译的插件来完成增强 这种方法会直接修改编译完成的class文件&#xff0c;不需要依赖springboot 2.动态代理proxy 2.1cglib 可以代理接口&#xff0c;方法等&#xff0c;这种方式代理类是目标类的子类&#xff0c;要求目标类不…

使用 EFCore 和 PostgreSQL 实现向量存储及检索

随着 ChatGPT 的兴起及其背后的 AIGC 产业不断升温,向量数据库已成为备受业界瞩目的领域。FAISS、Milvus、Pinecone、Chroma、Qdrant 等产品层出不穷。市场调研公司 MarketsandMarkets 的数据显示,全球向量数据库市场规模预计将从 2020 年的 3.2 亿美元增长至 2025 年的 10.5…

Ps 滤镜:风格化

风格化 Stylize滤镜通过置换像素和通过查找并增加图像的对比度&#xff0c;基于原图像生成绘画或印象派的效果。 查找边缘 Find Edges “查找边缘”滤镜通过分析图像的色彩和亮度变化来识别边缘。 这种处理方式使得图像的主要轮廓以一种艺术化的线条形式被强调出来&#xff0c;…

大语言模型的指令调优:综述

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题&#xff1a;Instruction Tuning for Large Language Models: A Survey 论文地址&#xff1a;https://arxiv.org/abs/2308.10792 指令调优是提升大语言模型&#xff08;LLMs&#xff09;性能…

python爬虫3-xpath批量定位元素的方法

以爬取豆瓣影评的电影名称为例。 第一步 鼠标右键单击&#xff0c;选择【检查】 第二步 切换到【元素】标签&#xff0c;展示源代码 选择下图的小箭头&#xff0c;再选择想要定位的文本&#xff0c;源代码会自动定位到该文本。 第三步 鼠标放在该文本的源代码上&#xff0c;…

Pytorch官方FlashAttention速度测试

在Pytorch的2.2版本更新文档中&#xff0c;官方重点强调了通过实现FlashAtteneion-v2实现了对scaled_dot_product_attention约2X左右的加速。 今天抽空亲自试了下&#xff0c;看看加速效果是否如官方所说。测试前需要将Pytorch的版本更新到2.2及以上&#xff0c;下面是测试代码…

Prometheus-Grafana基础篇安装绘图

首先Prometheus安装 1、下载 https://prometheus.io/download/ 官网路径可以去这儿下载 2、如图&#xff1a; 3.解压&#xff1a; tar -xf prometheus-2.6.1.linux-amd64 cd prometheus-2.6.1.linux-amd64 4.配置文件说明&#xff1a; vim prometheus.yml 5.启动Promethe…

kail渗透工具之nmap的使用方法

准备工作&#xff1a;开启两台虚拟机和一台Windows主机 kail Linux攻击机&#xff1a;192.168.80.131 red hat靶机&#xff1a;192.168.80.129 Windows主机&#xff1a;192.168.252.42 1、nmap扫描工具的简介 nmap是用来探测计算机网络上的主机和服务的一种安全扫描器。为了绘…

2024年视频号小店无货源,你一定要尝试一下,出九单收入1W+

大家好&#xff0c;我是电商花花。 如果说去年视频号的流量还差点意思&#xff0c;那么今年的视频号销量一定是非常高的&#xff0c;随着视频号的扩展&#xff0c;也让更多的创业者和博主入驻视频号&#xff0c;让更多人了解到了视频号小店&#xff0c;是这样赚钱的。 首先&am…

深水采样器小口径特氟龙材质FEP贝勒管

FEP贝勒管&#xff0c;深水采样器(bailers tube)&#xff0c;是一种经济型便携式水质采样器&#xff0c;操作简单&#xff0c;使用方便&#xff0c;性价比高&#xff0c;能大限度的保证样品的真实性。采样管直径很小&#xff0c;能够采取小口径的深水井水样。是一款简单实用&am…

磁盘管理显示u盘无媒体怎么恢复数据

随着科技的发展&#xff0c;U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而&#xff0c;当我们在使用U盘时&#xff0c;有时会遇到“磁盘管理显示U盘无媒体”的困扰。面对这一问题&#xff0c;许多用户可能会感到惊慌失措&#xff0c;担心数据丢失。本文将为您详细…

c语言例题,计算1/1-1/2+1/3-1/4+1/5……+1/99-1/100的值,打印结果

例题&#xff1a;计算分式1/1-1/21/3-1/41/5……1/99-1/100的值&#xff0c;打印结果 根据题目&#xff0c;我们知道需要计算的是一个固定值&#xff0c; 先定义三个变量来当作分式里的三个值&#xff0c;变量i当作分式里的分母部分&#xff0c;通过for循环来实现分母每次循环…

存储器层次结构

内存 对于内存已经不像曾经那般陌生了&#xff0c;在汇编中&#xff0c;我们大量接触了内存&#xff0c;但是我们还没有对它有个确切、深入的了解。 内存其实叫做随机访问存储器&#xff08;RAM&#xff0c;Random Access Memory&#xff09;&#xff0c;最基本的存储单位称为…

怎么获取OpenAI的api-key【人工智能】

怎么获取OpenAI的api-key【人工智能】 前言版权推荐怎么获取OpenAI的api-key1.访问控制台2.点击API keys3.点击Start verification4.点击新建密钥 最后 前言 2024-4-11 11:32:06 以下内容源自《【人工智能】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首…

自动挡变速箱 相关的东西研究

1. 原来大众POLO变速箱故障时&#xff0c;详细的维修流程是这样的&#xff01;_易车 原来大众POLO变速箱故障时&#xff0c;详细的维修流程是这样的&#xff01;_易车 大众POLO七速干式双离合变速箱OAM 本文主要讲解的是大众POLO双离合变速箱的维修案例&#xff0c;首先说一…

【C++】模版

目录 一、泛型编程二、函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 三、类模板3.1 类模板的定义格式3.2 类模板的实例化 四、非类型模板参数五、模板的特化5.1 概念5.2 函数模板特化5.3 类模板特化5.3.1 全特化5.3…

JS加密:对比JScrambler和JShaman加密效果

本文&#xff0c;以一个实例&#xff0c;比对JS加密两大神器&#xff1a;JScrambler、JShaman的加密结果&#xff0c;看看谁的加密效果更好。 注&#xff1a;本文不是技术文章&#xff0c;仅仅从加密结果的“型”上简单观查&#xff0c;不做技术分析&#xff0c;仅看哪个加密代…

【计算机考研】数据结构都不会,没有思路,怎么办?

基础阶段&#xff0c;并不需要过于专门地练习算法。重点应该放在对各种数据结构原理的深入理解上&#xff0c;也可以说先学会做选择题、应用题。 因为在考试中&#xff0c;大部分的算法题目&#xff0c;尤其是大题&#xff0c;往往可以通过简单的暴力解决方案得到较高的分数。…