构造函数与析构函数的显示调用

目录

前言:

构造函数的显示调用

显示调用无参构造

隐式调用无参构造

显示调用有参构造

构造函数的执行顺序 

析构函数的显示调用

析构函数的调用顺序

显示调用析构函数


前言:

构造函数是类的特殊成员函数,创建对象时编译器会自动调用构造函数

析构函数是类的特殊成员函数,当对象的生命周期结束时,编译器自动隐式调用析构函数

构造函数的显示调用

构造函数按照参数类型可以分为有参构造无参构造,调用构造函数的方式分别为显示调用隐式调用

显示调用无参构造

class Date
{
public:
	//构造函数函数名与类名相同且无返回值
	//无参构造
	Date()
	{
		cout << "调用构造函数" << endl;
	}
private:
	int _year = 2024;
	int _month = 3;
	int _day = 1;
};
int main()
{
	//显示调用
	Date d = Date();
	return 0;
}

监视窗口:

运行窗口:

注:构造函数调用时先执行初始化列表的位置,在执行函数体中的语句;

隐式调用无参构造

class Date
{
public:
	//构造函数函数名与类名相同且无返回值
	//无参构造
	Date()
	{
		cout << "调用构造函数" << endl;
	}
private:
	int _year = 2024;
	int _month = 3;
	int _day = 1;
};
int main()
{
	//隐式调用
	Date d;
	return 0;
}

监视窗口:

运行窗口:

显示调用有参构造

class Date
{
public:
	//构造函数函数名与类名相同且无返回值
	//有参构造
	Date(int year,int month,int day)
		: _year(year)
		, _month(month)
		, _day(day)
	{
		cout << "调用构造函数" << endl;
	}
private:
	int _year = 2024;
	int _month = 3;
	int _day = 1;
};
int main()
{
	//显式调用
	Date d(2024, 3, 15);
	return 0;
}

监视窗口:

运行窗口:

总结:

  • 一般情况下默认的无参构造函数自动地隐式调用
  • 有参构造函数是由开发者手动地显示调用

构造函数的执行顺序 

class A
{
public:
	A()
	{
		cout << "调用A类的构造函数" << endl;
	}
private:
	int _a = 1;
};

class B
{
public:
	B()
	{
		cout << "调用B类的构造函数" << endl;
	}
private:
	int _b = 2;
};

class C
{
public:
	C()
	{
		cout << "调用C类的构造函数" << endl;
	}
private:
	int _c = 3;
};

class D
{
public:
	D()
	{
		cout << "调用D类的构造函数" << endl;
	}
private:
	int _d = 4;
};

C c;//全局对象
int main()
{
	A a;
	B b;
	static D d;//静态对象
	return 0;
}

运行结果:

构造函数:定义对象时进行调用;

析构函数的显示调用

析构函数的调用顺序

class A
{
public:
	~A()
	{
		cout << "调用A类的析构函数" << endl;
	}
private:
	int _a = 1;
};

class B
{
public:
	~B()
	{
		cout << "调用B类的析构函数" << endl;
	}
private:
	int _b = 2;
};

class C
{
public:
	~C()
	{
		cout << "调用C类的析构函数" << endl;
	}
private:
	int _c = 3;
};
class D
{
public:
	~D()
	{
		cout << "调用D类的析构函数" << endl;
	}
private:
	int _d = 4;
};

C c;//全局对象
int main()
{
	A a;//局部对象
	B b;//局部对象
	static D d;//静态对象
	return 0;
}

运行结果:

监视窗口:

  1. 局部对象的析构顺序与构造顺序相反,由于局部对象存放于栈区,栈区高地址处存放对象a,低地址处存放对象b(栈区使用习惯先使用高地址,再使用低地址),析构时先销毁低地址处的局部对象,后销毁高地址处的局部对象;
  2. static修饰的静态对象存放于静态区,对象生存的作用域(main()函数内部)结束时销毁;
  3. 程序结束时销毁全局对象;

显示调用析构函数

class Test
{
public:
	Test()
	{
		cout << "调用构造函数" << endl;
	}
	~Test()
	{
		cout << "调用析构函数" << endl;
	}
private:
	int _a;
};

int main()
{
	Test t;
	t.~Test();//显示调用析构函数
	return 0;
}

运行结果:

开发者创建的对象通常在语句体{ }中,当语句体{ }结束时该对象被销毁,但是这种对象通常存放于栈区这就意味着如何管理此对象,是由操作系统完成而开发者无法控制;所以即使开发者显示调用析构函数,当对象的生命周期结束时,操作系统依然会再次调用析构函数,将其在栈区销毁,实现真正的析构

class Test
{
public:
	Test()
	{
		cout << "调用构造函数" << endl;
		_a = new int[10];//堆区申请空间
	}
	~Test()
	{
		cout << "调用析构函数" << endl;
		delete[] _a;//释放堆区开辟的空间
	}
private:
	int* _a;
};

int main()
{
	Test t;
	t.~Test();
	return 0;
}

运行结果:

一旦析构函数中存在释放堆空间的语句,第二次调用析构函数会释放已经释放的空间,导致系统崩溃;

第一次显示调用析构函数,相当于调用一个普通的成员函数,执行函数体内的语句,释放了堆内存,但是并未释放栈内存对象还存在

第二次操作系统调用析构函数,再次释放堆内存,造成系统崩溃,然后真正释放栈内存,销毁对象

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win10开启了hyper-v,docker 启动还是报错 docker desktop windows hypervisor is not present

问题 在安装了docker windows版本后启动 docker报错docker desktop windows hypervisor is not present 解决措施 首先确认windows功能是否打开Hyper-v 勾选后重启&#xff0c;再次启动 启动后仍报这个错误&#xff0c;是Hyper-v没有设置成功 使用cmd禁用再启用 一.禁用h…

oracle docker安装

修改下载的Image的REPOSITORY和TAG属性 修改下载的Image的REPOSITORY和TAG属性&#xff1a;docker tag <IMAGE ID> <REPOSITORY NAME> docker tag 3fa112fd3642 aliyun/oracle_11g 参考网址 使用docker images时&#xff0c;可能会出现REPOSITORY和TAG均为none的镜…

【JVM】JVM 运行时数据区简介

文章目录 &#x1f334;简介&#x1f332;堆&#xff08;线程共享&#xff09;&#x1f384;本地方法栈&#xff08;线程私有&#xff09;&#x1f333;程序计数器&#xff08;线程私有&#xff09;&#x1f340;方法区&#xff08;线程共享&#xff09;&#x1f338;JDK 1.8 元…

文件的读取与操作

文件类型&#xff1a; 从文件功能的角度来分类&#xff1a; 1.程序⽂件 程序⽂件包括源程序⽂件&#xff08;后缀为.c&#xff09;,⽬标⽂件&#xff08;windows环境后缀为.obj&#xff09;,可执⾏程序&#xff08;windows 环境后缀为.exe&#xff09;。 2. 数据⽂件 ⽂件…

Office办公软件之word的使用(一)

前几天调整公司招标文件的格式&#xff0c;中途遇到一些问题&#xff0c;感觉自己还不是太熟悉操作&#xff0c;通过查阅资料&#xff0c;知道了正确的操作&#xff0c;就想着给记下来。如果再次遇到&#xff0c;也能很快地找到解决办法。 一、怎么把标题前的黑点去掉 解决办法…

latex $$斜体间距太大 解决方案

不要直接$NPSB$&#xff0c; 而是使用$\textit{NPSB}$

Node Sass does not yet support your current environment

项目运行时报错&#xff1a;Node Sass does not yet support your current environment 原因是node版本过高。 解决办法&#xff1a; 使用nvm管理node版本&#xff0c;&#xff08;如何安装nvm&#xff1f;请点击跳转&#xff09; 具体步骤如下&#xff1a; 1.查看当前node…

工业新力军!你不知道的工业电脑触摸一体机

作为普通用户&#xff0c;接触最多的电脑肯定是商用台式电脑、笔记本电脑以及平板电脑等&#xff0c;这类电脑产品面向的均是个人需求。那工业级触摸一体机电脑又是什么&#xff1f;它究竟有何特点能够在工业行业中大放异彩呢&#xff1f; 工业电脑的好处是&#xff1a;1、壳子…

电源设计中的去耦电容深入理解及应用实例,非常实用!

很多新手设计电路&#xff0c;通常会觉得电源的设计很简单&#xff0c;不就是线性电源和开关电源吗&#xff1f;找个参考设计抄一下就行了。。。。。 因此&#xff0c;电源往往是我们在电路设计过程中最容易忽略的环节。相反&#xff0c;电源虽然是设计中非常基础的部分&#x…

Python爬虫如何快速入门

写了几篇网络爬虫的博文后&#xff0c;有网友留言问Python爬虫如何入门&#xff1f;今天就来了解一下什么是爬虫&#xff0c;如何快速的上手Python爬虫。 一、什么是网络爬虫 网络爬虫&#xff0c;英文名称为Web Crawler或Spider&#xff0c;是一种通过程序在互联网上自动获取…

接口测试详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0…

工业级POE交换机的SSH配置步骤

工业级POE交换机的SSH&#xff08;Secure Shell&#xff09;配置可以通过以下步骤进行&#xff1a; 1. 连接到POE交换机&#xff1a;使用一个支持SSH协议的终端工具&#xff08;如PuTTY&#xff09;连接到POE交换机的管理接口。 2. 登录到POE交换机&#xff1a;输入正确的用户…

c++核心学习--继承2

4.6.7多继承语法 4.6.8菱形继承 利用虚继承解决菱形继承的问题&#xff1a;继承之前加上关键字virtual变为虚继承

C++|类封装、类的分文件编写练习:设计立方体类、点和圆的关系

文章目录 练习案例1&#xff1a;设计立方体类CPP代码 练习案例2:点和圆的关系CPP代码 代码总结类的分文件编写 练习案例1&#xff1a;设计立方体类 设计立方体类(Cube) 求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等。 CPP代码 class Cube { pub…

【Hello,PyQt】QTextEdit和QSplider

PyQt5 是一个强大的Python库&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;。其中&#xff0c;QTextEdit 控件作为一个灵活多用的组件&#xff0c;常用于显示和编辑多行文本内容&#xff0c;支持丰富的格式设置和文本操作功能。另外&#xff0c;QSlider 控件是一…

Mybatis细节详解

上一篇分享了一个Mybatis的快速入门案例&#xff0c;本贴再详细说明几个细节点~ 一.Mapper代理开发 1.定义接口 定义一个接口&#xff0c;并在resources中定义mapper文件夹&#xff0c;文件夹中存放同名的xml配置文件。 2.设置namespace属性 <?xml version"1.0&qu…

信息化平台管理系统智能引擎,互联网企业转型升级的新篇章-亿发

企业管理系统一直在伴随着中国互联网企业的发展而不断进步。过去&#xff0c;企业管理主要依赖于传统的表格和图表记录&#xff0c;但随着互联网企业的崛起&#xff0c;他们开始尝试自己开发简易的管理系统以满足业务需求。随着企业规模和业务复杂度的增加&#xff0c;互联网企…

安达发|印染行业选择APS自动排单软件需要注意什么?

在印染行业中&#xff0c;APS&#xff08;高级计划排程系统&#xff09;自动排单软件的应用可以极大地提升生产效率、减少浪费、优化资源分配&#xff0c;并提高客户满意度。然而&#xff0c;在选择和实施APS自动排单软件时&#xff0c;企业需要注意以下几个关键点&#xff1a;…

【漏洞复现】用友U8 login2.RegisterServlet接口处存在SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

6款最值得推荐的电脑监控软件丨高人气甄选

突然收到老板发问&#xff1a; 就问你抖不抖&#xff01;&#xff01;&#xff01; 后来才得知&#xff0c;老板安装了电脑监控软件。 但具体是哪款不太晓得&#xff0c;鉴于此专门去调研了一番&#xff0c;给大家看看小编的调研成果。 有哪些电脑监控软件呢&#xff1f; 一…