C++类和对象(2)构造、析构函数

news2024/9/21 20:51:24

类的6个默认成员函数

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

class Date{};

空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员
函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
 本文继续来介绍C++中内容:构造函数与析构函数。

构造函数

概念

在之前数据结构栈的相关章节中,可以发现一个问题,在使用的时候经常会忘记进行初始化与销毁释放工作。在C++中就有了自动进行初始化与销毁释放空间的函数。

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

特性

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

其特征如下:

1、函数名与类名相同。

2、无返回值。

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

4、构造函数可以重载。

下面举出两个类作为例子:

class Stack
{
public:
	Stack()
	{
		cout << "Stack()" << endl;
        // ...
	}

	Stack(int n)
	{
		cout << "Stack(int n)" << endl;
        // ...
	}

	void Push(int x)
	{
		//...
	}

private:
	// 成员变量
	int* _a;
	int _size;
	int _capacity;
};

int main()
{
	Stack s1;// 调用无参构造函数
	Stack s2(4);// 调用带参的构造函数
	Stack s1();// err
	// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
	// 以下代码的函数:声明了s3函数,该函数无参,返回一个Satck类型的对象
	// warning C4930: “Stack s3(void)”: 未调用原型函数(是否是有意用变量定义的?)
	s1.Push(1);
	return 0;
}
class Date
{
public:
	// 1.无参构造函数
	Date()
	{}
    
    //默认生成的构造函数对内置类型不处理
    //默认生成的析构函数对内置类型不处理

	// 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;
};
int main()
{
	Date d1; // 调用无参构造函数
	//Date d2(2015, 1, 1); // 调用带参的构造函数
	d1.Print();
}

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

6、关于编译器生成的默认成员函数:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型,编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。当我们在编写日期类时如果使用默认构造函数,后有这样的问题:

默认构造函数:

  1. 内置类型成员不作处理。
  2. 自定义类型成员,会去调用它的默认构造(不用传参数)
  3. 默认生成的构造函数的例子:用栈来实现队列的题目
    class MyQueue 
    {
    	public:
    		// 默认生成构造函数,对自定义类型成员,会调用他的默认构造函数
    		// 默认生成析构函数,对自定义类型成员,会调用他的析构函数
    	
    		void push(int x) {
    	
    		}
    		//....
    	
    		Stack _pushST;
    		Stack _popST;
    		int _size = 0;
    };
    	
    	int main()
    	{
    		MyQueue q;
    	
    		return 0;
    	}

     

可以看到在左图中,确实调用了自定义类型的默认构造函数与析构函数。

为了解决默认生成的构造、析构函数对内置类型不处理的问题,可以在声明的时候就给出缺省值。

7、无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数(不传参数就可以调用构造函数),都可以认为是默认构造函数。以上述日期类作为例子:

 Date() 与 Date(int year = 1, int month = 1, int day = 1)会存在歧义。

析构函数

概念

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

特性

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

1、析构函数名是在类名前加上字符 ~。

2、无参数无返回值类型。

3、一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载

4、对象生命周期结束时,C++编译系统系统自动调用析构函数。

	~Stack()
	{
		cout << "~Stack()" << endl;
		free(_a);
		_a = nullptr;
		_size = _capacity = 0;
	}

5、关于编译器自动生成的析构函数,是否会完成一些事情呢?编译器生成的默认析构函数,对自定类型成员调用它的析构函数。

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

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

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

相关文章

什么是健康建筑?

WIKIPEDIA健康建筑是指支援建筑和建筑环境中人们&#xff0c;身体、心理和社会健康与福祉的新兴兴趣领域。建筑物可以成为健康和福祉的关键促进者&#xff0c;因为大多数人大部分时间都花在室内。根据全美国人类活动模式调查&#xff0c;美国人「平均 87% 的时间花在封闭的建筑…

redis-如何保证数据库和缓存双写一致性?

前言 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 我很负责的告诉大家&#xff0c;该问题无论在面试&#xff0c;还是工作中遇到的概率…

windows版Rsync服务端和客户端cwRsync_4.1.0安装测试

下载地址&#xff1a;https://download.csdn.net/download/qq_32421489/87463506 服务端安装&#xff1a; cwRsyncServer&#xff08;服务端&#xff09;配置步骤 1.双击运行wRsyncServer_4.1.0_Installer.exe。 2.这里创建的账户是操作系统的&#xff0c;创建的这个账户是专…

【 RA4M2开发板环境搭建之串口下载1】

【 RA4M2开发板环境搭建1】1. 前言1.1 活动来源1.2 开发环境1.3 RA4M2开发板2. MDK环境准备2.1 keil 5下载安装2.2 安装RA4M2的软件支持包2.3 Renesas Flash Programmer安装3. RA Smart Configurator配置3.1 下载RA Smart Configurator3.2 安装RA Smart Configurator4. 新建RA4…

你是真的“C”——C语言详解求两个正数最小公倍数的3种境界

C语言详解求两个正数最小公倍数的3种境界~&#x1f60e;前言&#x1f64c;必备小知识~&#x1f618;求最小公倍数境界1~ &#x1f60a;求最小公倍数境界2~ &#x1f60a;求最小公倍数境界3~ &#x1f60a;总结撒花&#x1f49e;博客昵称&#xff1a;博客小梦&#x1f60a; 最喜…

[Incognito 4.0] ictf 2023

一周4赛&#xff0c;有点赶不过来呀。只做了一点&#xff0c;队长组队的时候(每次都中间断掉&#xff0c;一大堆写的都得从头来)CryptoAncient这样的第2次见&#xff0c;第1次就不会&#xff0c;这回看了队友wp终于知道是怎么加密的了Templed每个符号可以表示4位10进制数。原题…

〖产品思维训练白宝书 - 核心竞争力篇⑭〗- 产品经理核心竞争力解读之学习能力

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

路径规划 | 图解跳点搜索JPS算法(附ROS C++/Python/Matlab仿真)

目录0 专栏介绍1 A*算法的弊端2 跳点搜索算法2.1 自然与强制邻点2.2 跳点剪枝策略3 算法仿真与实现3.1 算法流程3.2 ROS C实现3.3 Python实现3.4 Matlab实现0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细…

2. Unity操作基础知识

1. 创建新项目 双击打开 unity hub管理器&#xff0c;点击左侧栏中的 项目 选项卡&#xff0c;在右上角点击 新项目 按钮&#xff0c;进入项目创建页面&#xff1a; 在项目创建页面中&#xff0c;选择合适的模板&#xff0c;并设置项目名称&#xff0c;选择项目保存位置&…

【郭东白架构课 模块一:生存法则】12|法则五:如何提升一个架构设计的外部适应性?

你好&#xff0c;我是郭东白。 上节课我们讲了外部适应性这个概念&#xff0c;也强调了架构师的职责是通过架构活动为企业不断注入外部适应性&#xff0c;从而帮助企业更好地实现它的战略意图。 那么该怎么注入呢&#xff1f; 上节课在讲影响技术体系外部适应性的因素这部分…

MYSQL---第四次索引视图

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (…

AtCoder Beginner Contest 290 A-E F只会n^2

ABC比较简单就不再复述 D - Marking 简要题意 &#xff1a;给你一个长度为nnn的数组,下标为0到n−10 到 n-10到n−1&#xff0c;最初指针位于0,重复执行n-1次操作&#xff0c;每次操作的定义为将当前指针加上ddd&#xff0c;如果该位置为空(未填数),否则我们向右找到第一个为空…

《刀锋》读书笔记

刀锋&#xff08;毛姆长篇作品精选&#xff09;毛姆50个笔记点评认为好看的确是完美的结局。《刀锋》里面的人每个人都以自己的方式生活着。艾略特的势利&#xff0c;拉里的自由&#xff0c;伊莎贝尔的现实&#xff0c;苏珊的清醒&#xff0c;索菲的堕落&#xff0c;至于“我”…

【数据结构与算法】链表2:节点交换与删除 链表相交 环形链表

文章目录今日任务1.Leetcode24&#xff1a;两两交换链表中的节点&#xff08;1&#xff09;题目&#xff08;2&#xff09;思路&#xff08;3&#xff09;代码实现2.Leetcode19&#xff1a;删除链表的倒数第N个节点&#xff08;1&#xff09;题目&#xff08;2&#xff09;思路…

芯片架构RISC-V、X86、ARM三足鼎立

2022 年 7 月&#xff0c;RISC-V 国际基金会首席执行官 Calista Redmond 在嵌入式世界大会上宣布 RISC-V 架构处理器核的出货数量已突破 100 亿颗。 序号架构特点代表性的厂商运营机构发明时间1X86性能高&#xff0c;速度快&#xff0c;兼容性好英特尔&#xff0c;AMD英特尔197…

nginx-服务器banner泄漏风险

http { server_tokens off; # 隐藏Nginx版本号 .... }

桌面美化方案分享+环境配置记录

桌面美化方案分享环境配置记录 旧笔记本是高考结束时候买的&#xff0c;做工稀烂&#xff0c;买来当天键盘就被我敲坏了。当时送去维修&#xff0c;那边的人说暂时没货&#xff0c;要等键盘进货才能换。然后等了四年&#xff0c;键盘还没进到货。 该换了。 旧笔记本上显卡是…

【Vue3源码】第二章 effect功能的完善补充

【Vue3源码】第二章 effect功能的完善补充 前言 上一章节我们实现了effect函数的功能stop和onstop&#xff0c;这次来优化下stop功能。 优化stop功能 之前我们的单元测试中&#xff0c;stop已经可以成功停止了响应式更新&#xff08;清空了收集到的dep依赖&#xff09; st…

nginx+php-fpm整体上线k8s集群之后虚拟内存不断上涨原因排查

背景 为了可以更好的管理我们的lnmp集群&#xff0c;打算将原有的php环境整体打包成一个镜像然后上到k8s容器&#xff0c;这样可以不仅使用到k8s的快速扩缩容和管理的好处&#xff0c;而且让机器资源能更好被利用&#xff0c;减少机器数量 问题 当我们将流量从原有的php机器…

Elasticsearch的安装及常用操作

文章目录一、Elasticsearch的介绍1、Elasticsearch索引2、Elasticsearch的介绍二、Elasticsearch的安装1、安装ES服务2、安装kibana3、Docker安装ES4、Docker安装Kibana三、ES的常用操作1、索引操作2、文档操作3、域的属性3.1 index3.2 type3.3 store总结一、Elasticsearch的介…