C++ 对象的生存期

对象(包括简单变量)都有诞生和消失的时刻。对象诞生到结束的这段时间就是它的生存期。在生存期内,对象将保持它的状态(即数据成员的值),变量也将保持它的值不变,直到它们被更新为止。对象的生存期可以分为静态生存期动态生存期

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的地址。


(2)对于静态局部定义的对象,在程序控制首次到达该对象的定义处时,调用构造函数。当整个程序结束时调用析构函数。

class Complex
{int real;//实部int image;//虚部
public:Complex(int r = 0, int i = 0) :real(r), image(i){cout << "Create Complex: " << this << endl;Print();}~Complex(){cout << "Destroy Complex: " << this << endl;}void Print() const //常方法{cout << "Real= " << real << 't' << "Image= " << image << endl;}
};void fun()
{Complex c1(1,2);static Complex sc(4,5);  //.data  c1.Print();sc.Print(); 
}int main()
{for (int i = 0; i < 5; i++){fun();}return 0;}

运行结果: 

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

2.全局对象

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

全局对象具有静态生存期

//全局对象
class Complex
{int real;//实部int image;//虚部
public:Complex(int r = 0, int i = 0) :real(r), image(i){cout << "Create Complex: " << this << endl;Print();}~Complex(){cout << "Destroy Complex: " << this << endl;}void Print() const //常方法{cout << "Real= " << real << 't' << "Image= " << image << endl;}
};Complex c1(1, 1);int main()
{cout << "begin main: " << endl;Complex tmp(2, 2);cout << "end main: " << endl;return 0;
}Complex c3(3, 3);

运行结果如下图所示: 

3.块内对象

class Complex
{int real;//实部int image;//虚部
public:Complex(int r = 0, int i = 0) :real(r), image(i){cout << "Create Complex: " << this << endl;Print();}~Complex()               //没有形参         把空间还给系统{cout << "Destroy Complex: " << this << endl;}void Print() const       //常方法{cout << "Real= " << real << 't' << "Image= " << image << endl;}
};int main()
{cout << "begin main: " << endl;  //主程序开始Complex c1(1, 1);cout << "begin kuai: " << endl;{Complex c2(2, 2);}cout << "end kuai: " << endl;cout << "end main: " << endl;return 0;
}

 运行结果:

4.动态创建的对象 

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

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

class Complex
{int real;//实部int image;//虚部
public:Complex() :real(0), image(0){cout << "Create Complex: " << this << endl;}Complex(int r, int i) :real(r), image(i){cout << "Create Complex(int,int): " << this << endl;}~Complex(){cout << "Destroy Complex: " << this << endl;}void Print() const //常方法{cout << "Real= " << real << "Image= " << image << endl;}
};//动态创建对象//c malloc  free
//C+= new deleteint main()
{Complex* xp = (Complex*)malloc(sizeof(Complex)); // 1 申请空间    (只有空间没有对象)new(xp) Complex(2, 3);                           //通过定位new来创建空间//malloc 和 定位new的组合 相当于newxp->Print();xp->~Complex();free(xp);//相当于deletereturn 0;
}

运行结果:

使用new申请空间创建对象时调用构造函数,使用delete释放空间时调用析构函数。
在用new创建对象时,this指针指向该对象的地址。 

new示例1:

//动态创建对象
class Complex
{int real;//实部int image;//虚部
public:Complex() :real(0), image(0){cout << "Create Complex: " << this << endl;}Complex(int r, int i) :real(r), image(i){cout << "Create Complex(int,int): " << this << endl;}~Complex(){cout << "Destroy Complex: " << this << endl;}void Print() const //常方法{cout << "Real= " << real << "Image= " << image << endl;}
};//动态创建对象//c malloc  free
//C+= new deleteint main()
{int n = 5;Complex* xp = new Complex[n];  //1.计算大小 申请空间   2 调动构造函数 对每一个空间构造对象for (int i = 0; i < n; ++i){xp[i].Print();}delete[]xp;                 //申请一组对象xp = nullptr;return 0;
}

运行结果: 

new示例2: 

//动态创建对象
class Complex
{int real;//实部int image;//虚部
public:Complex() :real(0), image(0){cout << "Create Complex: " << this << endl;}Complex(int r, int i) :real(r), image(i){cout << "Create Complex(int,int): " << this << endl;}~Complex(){cout << "Destroy Complex: " << this << endl;}void Print() const //常方法{cout << "Real= " << real << "Image= " << image << endl;}
};//动态创建对象//c malloc  free
//C+= new deleteint main()
{int* ip = new int(10);              //1申请空间 2 初始化Complex* xp = new Complex(1, 2);    //1申请空间 2 调动构造函数创建对象xp->Print();(*xp).Print();delete xp;     //1 调动析构函数 2 换空间xp = nullptr;delete ip;ip = nullptr;return 0;
}

运行结果:

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

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

相关文章

蓝桥杯国一,非ACMer选手保姆级经验分享

目录 一、前言二、蓝桥杯简介三、0基础计算机新手小白&#xff0c;赛前如何准备提高自己的获奖率&#xff1f;3.1 每两周参加一次【蓝桥算法双周赛】3.2 多练真题3.3 参加每一场官方校内模拟赛 四、结语 一、前言 hello&#xff0c;大家好&#xff0c;我是大赛哥(弟)&#xff…

SpringBoot配置文件 —— 超详细全方位教程

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您也对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f9f8;祝诸君前程似锦&#xff0c;归来仍初心不忘&#xff01; &#x1f4dc;Spring&#xff0c;SpringBoot和SpringMVC的关系以及区别 —— 超准确…

【网络】TCP协议理论

TCP协议理论 一、TCP协议简介1、浅谈可靠性2、UDP协议存在的意义 二、TCP的协议格式TCP的解包和分用 三、确认应答机制一种应答方式——捎带应答 四、超时重传机制超时等待时间 五、流量控制1、TCP的缓冲区2、TCP的窗口大小3、TCP的PSH标志位 六、TCP的六个标志位URG字段的详细…

java DataSize存储容量单位规范化设置

之前的文章 java Duration格式规范化 自定义时间单位类型我们讲述了 Duration 这种jdk单位规范 其实我们还有一个单位 DataSize 我们这里属性类中 加入这个 DataSize的一个属性 然后设置他的 get set函数 然后 toString中加上他的输出 方便我们去看 这个类型是用来设置存储容…

[pytorch]设备选择以及卷积神经网络的应用

0.写在前面: 首先这篇文章还没写完,因为今天要尝试对我之前的一个框架做一个简单的更新迭代,所以目前先更新这么多. 1.关于设备的选择 首先,目前的大多数电脑都是自带一些GPU(图形计算单元,在这里被称之为cuda), 需要安装相关的驱动才能正常使用这些设备和调用他们的具体情况…

长安链可验证数据库,保证数据完整性的可信存证方案

近日&#xff0c;长安链发布“可验证数据库”实现了链上链下协同存储及数据完整性保证&#xff0c;显著提升长安链存储能力的可扩展性。 可信存证是联盟链最典型的应用场景&#xff0c;被广泛应用在司法、工业、农业、贸易等领域。联盟链的存证应用主要分为两个阶段&#xff1…

HarmonyOS开发(二):TypeScript入门

1、编程语言介绍 ArkTS是HarmonyOS主推的应用开发语言&#xff0c;它是在TypeScript语言的基础之上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 ArkTS、TypeScript和JavaScript之间…

机架式防雷PDU为IDC数据中心机房末端配电提供可靠保障

随着网络设备与各类通讯设备之间已经实现了智能化联网&#xff0c;取得的经济效益和社会效益逐步得到了体现。然而&#xff0c;由于雷电电磁脉冲感应造成的设备故障也越来越多&#xff0c;频繁的雷害对机房设备的正常工作造成了相当大的影响和危害&#xff0c;并给运行维护工作…

关于pip basicsr,facexlib,realesrgan et al.安装报错。

首先basicsr是一个超分的库&#xff0c;在ubuntu系统上pip时会报错。 上图这种错误&#xff0c;或者其他的错误&#xff0c;有的方法让去github上安装&#xff0c;那种方法到setup.py的时候也会报错。 问题在于首先 -i的源要换成阿里的源&#xff0c;然后要安装他要求的库&…

Java: 实现电影信息管理系统 (javaBean)

文章目录 电影信息系统1. 将JavaBean数据类封装好2.业务逻辑类3.测试类&#xff08;main函数类&#xff09; 电影信息系统 需求&#xff1a; 展示系统中的全部电影&#xff08;每部电影展示、名称、平分&#xff09;。允许用户根据电影编号&#xff08;id&#xff09;查询出某…

食醋行业分析:预计2029年将达到95亿美元

近年来中国食醋市场每年的销售量稳定增长&#xff0c;市场规模已经达到数百亿人民币。而在其他国家和地区&#xff0c;食醋也成为不可或缺的调味品之一&#xff0c;随着全球化和多样化的饮食趋势&#xff0c;国际市场对食醋的需求也不断增加。 食醋作为一种天然的酸味调节剂&am…

Springboot+vue的人力资源管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的人力资源管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的企业资产管理系统&#xff0c;采用M&#xff08;model&…

ds前后台博客系统

源码私信或者公众号java大师获取 博客简介&#xff1a;本博客采用Spring Boot LayUI做为基础&#xff0c;进行的博客系统开发&#xff0c;与bootvue相比&#xff0c;更为适合开发简单的系统&#xff0c;并且更容易上手&#xff0c;简单&#xff01;高效&#xff01;更易上手&a…

为什么审计平台不适合进行数据库变更管理?

关于视源电子 广州视源电子科技股份有限公司 (CVTE) 成立于 2005 年 12 月&#xff0c;旗下拥有多家业务子公司。 截至 2022 年底&#xff0c;公司总人数超 6000 人&#xff0c;约 60% 为技术人员。公司的主营业务为液晶显示主控板卡和交互智能平板等显控产品的设计、研发与销…

离散时间系统模型

离散时间系统模型 离散时间系统模型是表示数字滤波器的方案。MATLAB 科学计算环境支持若干种离散时间系统模型&#xff0c;这些模型将在以下章节中介绍&#xff1a; ​传递函数零极点增益状态空间部分分式展开式&#xff08;残差形式&#xff09;二阶节 (SOS)格型结构体卷积矩…

为什么笔记不收录,小红书作品收录逻辑分析!

小红书作品收录问题&#xff0c;是平台大家广泛关注的问题。这是因为&#xff0c;一篇作品是否被有效收录&#xff0c;将会直接决定作品所能捕获的流量。今天给大家分享下为什么笔记不收录&#xff0c;小红书作品收录逻辑分析&#xff01; 一、作品收录是指什么 小红书平台的作…

Kotlin Multiplatform稳定版本发布:加速跨平台开发的新里程碑

Kotlin Multiplatform稳定版本发布&#xff1a;加速跨平台开发的新里程碑 引言 在最新的消息中&#xff0c;JetBrains团队宣布Kotlin Multiplatform&#xff08;KMP&#xff09;将于2023年10月稳定发布。这一消息对于广大开发者来说毫无疑问是一个令人振奋的消息。KMP的正式生…

后端面试问题(学习版)

JAVA相关 JAVA语言概述 1. 一个".java"源文件中是否可以包含多个类&#xff1f;有什么限制&#xff1f; 可以。 一个源文件可以声明多个类&#xff0c;但是最多只能有一个类使用public进行声明 且要求声明public的类的类名与源文件相同。 2. Java的优势&#xff…

C++——const成员

这里先用队列举例&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <assert.h> using namespace std; class SeqList { public:void pushBack(int data){if (_size _capacity){int* tmp (int*)realloc(a, sizeof(int) * 4);if (tm…

在以BUF,字节存储区中,存放有n个带符号整数。试编写统计其中负偶数个数(假设≤9)并且显示。

;默认认采用ML6.11汇编程序 DATAS SEGMENT;此处输入数据段代码BUF DB -2,2,3,4,-4N$-BUF DATAS ENDS STACKS SEGMENT;此处处输入堆栈段代码 STACKS ENDS CODES SEGMENTASSUME CS:CODES,DS: DATAS, SS:STACKS START:MOV AX, DATASMOV DS,AXMOV BX,0MOV CX,0 LOP: mov AX,[BX] RO…