C++ 对象的生存期详解

news2024/12/24 21:46:09

1.局部对象

(1)对于局部定义的对象,每当程序控制流到达该对象定义处时,定义构造函数。当程序走出该局部域时,调用析构函数。

这种普通的局部对象具有动态生存期。

#include<iostream>
using namespace std;

class Complex
{
	double Real;//实部
	double Image;//虚部
public:
	Complex() :Real{}, Image{}//缺省的构造函数
	{
		cout << "构造一个对象:" << this << endl;
	}
	Complex(double r, double i) :Real{ r }, Image{ i }//带参数的构造函数
	{
		cout << "构造一个对象:" << this << endl;
	}
	~Complex()
	{
		cout << "析构一个对象:" << this << endl;
	}
	void Print() const  //常方法
	{
		cout << "Real=" << Real << '\t' << "Image" << Image << endl;
	}
};
void fun()
{
	Complex c1(1.0, 2.0);
}

void main()
{
	int n = 5;
	for(int i=0;i<n;i++)
	{
		fun();
	}
}

运行结果及分析:
从结果可以看出,每调用一次fun函数时,就先调用构造函数,再调用析构函数,因此会出现下面的运行结果。每次调用fun函数时,都是在给Complex类的对象c1赋值时调用构造函数,在fun函数结束时再调用析构函数,一共调用5次fun函数。
另外在每次调用fun函数时,this指针都指向Complex类的对象c1的地址。
在这里插入图片描述
②对于静态局部定义的对象,在程序控制首次到达该对象的定义处时,调用构造函数。当整个程序结束时调用析构函数。

静态局部对象具有静态生存期。

class Complex
{
	double Real;//实部
	double Image;//虚部
public:
	Complex() :Real{}, Image{}//缺省的构造函数
	{
		cout << "构造一个对象:" << this << endl;
	}
	Complex(double r, double i) :Real{ r }, Image{i}//带参数的构造函数
	{
		cout << "构造一个对象:" << this << endl;
	}
	~Complex()
	{
		cout << "析构一个对象:" << this << endl;
	}
	void Print() const  //常方法
	{
		cout << "Real=" << Real << '\t' << "Image" << Image << endl;
	}
};
void fun()
{
	static Complex sc(3.0, 4.0);
}

void main()
{
	int n = 5;
	for(int i=0;i<n;i++)
	{
		fun();
	}
}

运行结果及分析:
从运行结果可以看出,因为在定义对象时有static关键字,所以该对象具有静态生存期,也就是说该对象为静态对象,当程序第一次到达该对象定义处时,调用构造函数,当这个程序结束时,也就是调用5次fun函数结束后,再调用析构函数。
注意:因为有关键字static,所以并不是调用一次fun函数,就调用一次构造函数和析构函数。
在这里插入图片描述

2.全局对象

对于全局定义的对象,每当程序进入入口函数main之前对象就以及定义,这时要调用构造函数。整个程序结束时才调用析构函数。

全局对象具有静态生存期

#include<iostream>
using namespace std;

class Object
{
private:
	int value;
public:
	Object(int x = 0) :value(x)
	{
		cout << "构造Object对象:" << value << endl;
	}
	~Object()
	{
		cout << "析构Object对象:" << value << endl;
	}
};
Object obja(1);//全局对象
int main()
{
	Object objb(2);//局部对象
	return 0;
}
Object objc(3);//全局对象

运行结果及分析:
在这里插入图片描述
有结果可以看出,对于全局对象,当程序开始运行时顺序执行,先调用Object类的全局对象obja(1),调用一次构造函数;再调用Object类的全局对象objc(3),再调用一次构造函数;最后调用主函数中的Object类的局部对象objb(2),再调用一次构造函数。但是调用析构函数时,与调用构造函数的调用顺序相反,调用顺序为Object objb(2),Object objc(3),Object obja(1)。

3.动态创建的对象

使用new创建对象,delete释放对象。
(1)使用malloc和free

malloc在使用时,申请内存空间是从堆中获取。

#include<iostream>
using namespace std;

class Complex
{
private:
	double Real;//实部
	double Image;//虚部
public:
	Complex() :Real{}, Image{}  //缺省的构造函数
	{
		cout << "构造对象:" << this << endl;
	}
	Complex(double r, double i) :Real{ r }, Image{ i }//带参数的构造函数
	{
		cout << "构造对象: " << this << endl;
	}
	~Complex()
	{
		cout << "析构对象:" << this << endl;
	}
	void Print() const  //常方法
	{
		cout << "Real=" << Real << '\t' << "Image=" << Image << endl;
	}
};
int main()
{
	int n = 5;
	Complex* cp = (Complex*)malloc(sizeof(Complex));
	cp->Print();
	free(cp);

	Complex* bp = (Complex*)malloc(sizeof(Complex) * n);
	bp->Print();
	free(bp);

	return 0;
}

运行结果:
在这里插入图片描述
(2)使用new创建对象

#include<iostream>
using namespace std;

class Complex
{
private:
	double Real;//实部
	double Image;//虚部
public:
	Complex() :Real{}, Image{}  //缺省的构造函数
	{
		cout << "构造一个对象:" << this << endl;
	}
	Complex(double r, double i) :Real{ r }, Image{ i }//带参数的构造函数
	{
		cout << "构造一个对象: " << this << endl;
	}
	~Complex()
	{
		cout << "析构一个对象:" << this << endl;
	}
	void Print() const  //常方法
	{
		cout << "Real=" << Real << '\t' << "Image=" << Image << endl;
	}
};

int main()
{
	int n = 5;
	Complex* cp = new Complex(1,2);
	cp->Print();
	delete cp;
	return 0;
}

运行结果及分析:
使用new申请空间创建对象时调用构造函数,使用delete释放空间时调用析构函数。
在用new创建对象时,this指针指向该对象的地址。
在这里插入图片描述

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

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

相关文章

学习C#编写上位机的基础知识和入门步骤:

00001. 掌握C#编程语言基础和.NET框架的使用。 00002. 学习WinForm窗体应用程序开发技术&#xff0c;包括控件的使用和事件驱动编程。 00003. 熟悉基本的数据结构和算法知识&#xff0c;如链表、栈、队列等。 00004. 理解串口通信协议和通信方法&#xff0c;用于与底层硬件设…

增强for循环原理详解

增强for循环 本质是采用了迭代器&#xff0c;并使用局部变量指向迭代器当前遍历到的元素&#xff0c;使用增强for循环时&#xff0c;无法修改集合当前索引位置的引用&#xff0c;但是如果元素是引用数据类型&#xff0c;那么是可以修改这个元素的信息的&#xff08;String除外…

PSP - HHblits 算法搜索 BFD 与 UniRef30 的结果分析 (bfd_uniref_hits.a3m)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132047940 MMseqs2 与 HHblits 的算法比较&#xff1a; 蛋白质序列搜索算法 MMseqs2 与 HHblits 的搜索结果差异HHblits 算法搜索 BFD 与 UniRef…

Vulnhub: Wayne Manor:1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.172 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.172 根据提示修改hosts文件 访问目标80&#xff0c;在主页发现三组数字&#xff0c;结合端口扫描的结果中21端口被过滤&am…

Java 线程的多种状态

前言 在前文中详细介绍了线程的启动、中断、休眠、等待。本文详细介绍线程的多种状态。 获取线程的当前状态代码是&#xff1a; 线程对象.getState(); 目录 前言 一、NEW 二、RUNNABLE 三、BLOCKED 四、WAITNG 五、TIMED_WAITNG 六、TERMINATED 结语 一、NEW Thread 对…

Your local changes to the following files would be overwritten by checkout

Git 之 Your local changes to the following files would be overwritten by checkout 今天在切换分支时遇到了这样一个问题&#xff1a; 首先翻译下&#xff1a; Your local changes to the following files would be overwritten by checkout 大致意思就是&#xff1a; 当…

中海油集团,建设与中国特色国际一流能源公司相匹配的供应管理体系

近日&#xff0c;由中国物流与采购联合会主办、北京筑龙承办的主题为“数智赋能创新发展”的“第四届国有企业数智化采购与智慧供应链论坛”在北京盛大举行。中国海油工程与物装部供应商管理处处长张彬出席论坛并发表讲话。 张彬处长出席在国有企业数字化采购与供应链论坛&…

电子邮件模板?如何做EDM邮件营销模板?

制作EDM电子邮件推广模板的方法&#xff1f;怎么写EDM电子邮件推销模板&#xff1f; 随着数字化时代的来临&#xff0c;EDM邮件营销模板已成为企业推广和客户沟通的重要工具。在本文中&#xff0c;我将分享一些关于如何制作高效的EDM邮件营销模板的技巧和建议&#xff0c;希望…

Kafka的安装和使用(Windows中)

1.安装Kafka 1.1下载安装包 通过百度网盘分享的文件&#xff1a;复制链接打开「百度网盘APP 即可获取」 链接&#xff1a;https://pan.baidu.com/s/1vC6Di3Pml6k1KMbnK0OE1Q?pwdhuan 提取码&#xff1a;huan 也可以访问官网&#xff0c;下载kafka2.4.0的安装文件 1.2解压…

Linux:shell脚本:基础使用(1)

Shell的作用 命令解释器&#xff0c;“翻译官”&#xff0c;介于系统内核与用户之间&#xff0c;负责解释命令行 用户的登录Shell 登录后默认使用的Shell程序&#xff0c;一般为 /bin/bash 不同Shell的内部指令、运行环境等会有所区别 cat /etc/shells 编写第一个Shell脚本 …

装饰器模式(Decorator)

装饰器模式是一种结构型设计模式&#xff0c;用来动态地给一个对象增加一些额外的职责。就增加对象功能来说&#xff0c;装饰器模式比生成子类实现更为灵活。装饰器模式的别名为包装器(Wrapper)&#xff0c;与适配器模式的别名相同&#xff0c;但它们适用于不同的场合。 Decor…

P1219 [USACO1.5] 八皇后 Checker Challenge

题目 思路 非常经典的dfs题&#xff0c;需要一点点的剪枝 剪枝①&#xff1a;行、列&#xff0c;对角线的标记 剪枝②&#xff1a;记录每个皇后位置 代码 #include<bits/stdc.h> using namespace std; const int maxn105; int a[maxn];int n,ans; bool vis1[maxn],vis…

如何使用无线通信设备实现室内外精准定位管理?

巡更功能的意义 电子巡更系统的建立&#xff0c;使巡逻安防工作更加科学合理&#xff0c;使安全管理更加规范化、标准化制度化。例如&#xff0c;当管理人员设置巡更线路&#xff0c;在巡更线路上设置巡更点&#xff0c;通过巡更管理系为巡更人员排班在巡更区域内形成了一张防范…

《Java-SE-第二十三章》之单例模式

文章目录 单例模式概述饿汉模式懒汉模式单线程版懒汉单例多线程版枚举实现单例 单例模式概述 单例模式是设计模式中的一种,其作用能保证某个类在程序中只存在唯一一份实例,而不会创建多份实例。单例模式具体的实现方式, 分成 “饿汉” 和 “懒汉” 两种.。饿汉模式中的饿不并不…

R语言【Tidyverse、Tidymodel】的机器学习方法

机器学习已经成为继理论、实验和数值计算之后的科研“第四范式”&#xff0c;是发现新规律&#xff0c;总结和分析实验结果的利器。机器学习涉及的理论和方法繁多&#xff0c;编程相当复杂&#xff0c;一直是阻碍机器学习大范围应用的主要困难之一&#xff0c;由此诞生了Python…

深入浅出对话系统——大规模开放域对话模型PLATO

引言 今天主要介绍百度退出的大模型开放领域对话模型PLATO的三篇论文&#xff0c;分别对应三个模型。 PLATO 132M parameters8M samples问题&#xff1a;训练稳定性和效率 PLATO-2 1.6B, 314M and 93M parameters684M samples PLATO-XL 11B parameters811M samples for en1.2…

JavaWeb(8)——前端综合案例2(节流和防抖)

目录 一、节流和防抖概念 二、实例演示 三、需要注意的 一、节流和防抖概念 二、实例演示 Lodash 简介 | Lodash中文文档 | Lodash中文网 (lodashjs.com) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><m…

vivo传便签数据到OPPO新手机上怎么操作

一般来说&#xff0c;一台手机在使用了三年之后&#xff0c;就容易出现各种各样的问题&#xff0c;这时候就需要考虑换手机了。而在更换手机的时候&#xff0c;有相当一部分消费者都会选择更换与旧手机不同品牌的手机使用&#xff0c;例如之前使用的手机是vivo的&#xff0c;现…

【云原生-制品管理】制品管理的优势

制品介绍制品管理-DevOps制品管理优势总结 制品介绍 制品管理指的是存储、版本控制和跟踪在软件开发过程中产生的二进制文件或“制品”的过程。这些制品可以包括编译后的源代码、库和文档&#xff0c;包括操作包、NPM 和 Maven 包&#xff08;或像 Docker 这样的容器镜像&…

Adobe Camera Raw 常用快捷键

戳下方链接&#xff0c;后台回复“230707PS插件”获取相关插件应用 回复“230708PS插件教程”获取教学链接; 回复“230730camera快捷键”获取快捷键链接。 原文链接&#xff1a;https://mp.weixin.qq.com/s/tVNDBPUtKrUtfGmPKJ0Tdw 目标调整工具 作用WindowsmacOS选取目标调整工…