【类的默认成员函数】构造函数析构函数【C++】

news/2024/11/28 10:36:38/文章来源:https://www.cnblogs.com/whiteink/p/18570265

【类的默认成员函数】构造函数&&析构函数【C++】

任何一个类在我们不写的情况下,都会自动生成6个默认成员函数

image

构造函数:初始化(不是开空间!)

日常实操中最好自己写一个!!!!!!!!

Date()
{_year = 1;_month = 1;_day = 1;
}

特点

(1)函数名和类名相同

(2)无返回值

(3)对象实例化时编译器自动调用对应的构造函数

自动调用,不用手动写
image

(4)构造函数可以重载

Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}

【调用方式】

Date d2(2023, 10, 21);

image

推荐使用全缺省的构造函数:是否传参数可由你决定。传参数数量也是由你决定

(普通函数和全缺省函数在调用时会出现错误)

//普通的构造函数Date(){_year = 1;_month = 1;_day = 1;}
//全缺省的构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}

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

如果一个类中的成员全是自定义类型,我们就可以用默认生成的函数
如果有内置类型的成员,或者需要显示传参初始化,那么都要自己实现构造函数

可以不传参数就调用构造,都可以叫默认构造

C++默认生成的构造函数对于内置类型成员变量不做处理,对于自定义类型的成员变量才会处理
(1)内置类型/基本类型:int、char、double、指针……
(2)自定义类型:class、struct去定义的类型对象

class A
{
public:A(){cout << "A()" << endl;_a = 1;}
private:int _a;
};
class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;cout << endl;}
private:int _year = 2023;int _month = 11;int _day = 11;A _aa;
};int main()
{Date d1;d1.Print();return 0;
}

image
发现A的初始化被处理了,Date则没有被处理

(6)无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。

注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数

不想自己再写构造函数也要对内置类型处理

class Date
{
public:// 我们不写,编译器会生成一个默认无参构造函数/*Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}*/void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:// C++11 打的补丁,针对编译器自己默认成员函数不初始化问题int _year = 2023;int _month = 10;int _day = 21;};
int main()
{// 没有定义构造函数,对象也可以创建成功,因此此处调用的是编译器生成的默认构造函数Date d;d.Print();
}

image

析构函数:清理(不是销毁!)~

如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类

有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类

~Date()
{cout << "~Date()" << endl;
}
class Date
{
public:Date(int year = 2023, int month = 10, int day = 21){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}~Date(){cout << "~Date()" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Print();return 0;
}

image

关于谁先构造谁先析构

int main()
{Stack st1;Stack st2;
}

st1和st2是在上的:先进后出
st2先析构,st1后析构

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

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

相关文章

Notepad++汉化教程

Notepad++系统只带了中文语言包,不需要像其他软件一样破解 1、打开Notepad++(通过文本文件右键选择以Notepad++打开或者找到Notepad++的快捷方式打开)。 2、菜单栏找到settings–>Preferences(首选项)。 3、找到General 右侧Localization选择简体中文,可以看到语言直接变…

文档解析Docling、Marker测评

Docling https://github.com/DS4SD/docling 环境安装 直接使用文档中的 pip install docling无法使用,因为torch和nvidia过高,与当前服务器版本不匹配,最好是低于当前服务器版本比较保险python第三方库中nvidia开头的版本需要小于12.2,如果使用12.4无法使用 安装步骤: pip…

explicit关键字【C++】

explicit关键字【C++】 用来修饰只有一个参数的类构造函数,以表明该构造函数是显式的,而非隐式的 禁止类对象之间的隐式转换,以及禁止隐式调用拷贝构造函数 隐式类型转换 int i = 1; double d = i;d被i赋值时 【编译器会做】 在中间产生一个临时变量 再通过这个临时对象进行…

快手观看时长建模:CREAD

将观看时长作为连续值预测,会带来“回归问题”,即会放大对异常值和潜在预测偏差的敏感性,常见的一种方法是把时长分段转为分类问题来预估,CREAD正是提出了一种回归转分类的处理方法。 CREAD的流程如下图所示,把观看时长分为M个桶,在每个桶内预估 P(y>t|x)的概率 经过推…

.NET9 EFcore支持早期MSSQL数据库 ROW_NUMBER()分页

前言 NET程序员是很幸福的,MS在上个月发布了NET9.0RTM,带来了不少的新特性,但是呢,我们是不是还有很多同学软硬件都还没更上,比如,自己的电脑还在跑Win7,公司服务器还在跑MSSQL2005-2008的! 这不就引入了我们本文要探索的问题,因为MS早在EFcore3.1后就不再内置支持ROW_NUMBER()…

hhdb数据库介绍(9-8)

高可用服务 计算节点负载均衡 HHDB Server支持多计算节点集群的节点自治。以下简称计算节点集群中Primary状态的计算节点为Primary计算节点;计算节点集群中Secondary状态的计算节点为Secondary计算节点。Primary和Secondary计算节点的数据服务完全对等,均支持所有类型的数据操…

Nuxt.js 应用中的 webpack:done 事件钩子

title: Nuxt.js 应用中的 webpack:done 事件钩子 date: 2024/11/26 updated: 2024/11/26 author: cmdragon excerpt: webpack:done 钩子用于处理 Webpack 编译完成后的逻辑。在 Webpack 编译的所有任务完成后,这个钩子会被调用,通常用于通知开发者编译的状态、执行清理工作…

ChatGPT的应用场景:开启无限可能的大门

ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中展现出了广泛的应用潜力。以下是ChatGPT八个最具代表性…

宝塔多PHP环境中如何切换composer的php环境

1.发现问题 宝塔上有php7.3与7.4两个版本;系统的默认执行命令是php7.3版本;目标项目环境是7.4;执行composer下载时,提示需要php环境版本为7.4; 2.解决问题宝塔上:网站》高级设置》PHP命令行版本 可以直接修改命令行版本;解决!!!!

时序数据库tdengine部署说明

TDengine 是一款开源、高性能、云原生的时序数据库(Time Series Database, TSDB)。 参考文档: https://docs.taosdata.com/目录单节点部署docker-compose启动连接测试集群部署集群规划部署过程初始化配置文件设置firstEp启动集群验证添加管理节点冗余nginx负载均衡部署 单节点…

GaussDB数据类型介绍

@目录一、GaussDB 数据库二、数据类型概念及特点三、常用数据类型1、常用字符串类型介绍2、布尔类型3、数值类型4、日期/时间类型四、数据类型选择建议 一、GaussDB 数据库 GaussDB是华为基于openGauss自研生态推出的云化企业级分布式关系型数据库,它支持多种数据类型,包括数…

Rookie Mistake pg walkthrough Intermediate

nmap ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A 192.168.189.221 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-26 00:11 UTC Stats: 0:01:03 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan Service scan Timing: About 50.00% done; ETC: 00…