C++ 创建并初始化对象

创建并初始化C++对象

当我们创建一个C++对象时,它需要占用一些内存,即使我们写一个完全为空的类,类中没有成员,什么也没有,它至少也要占用一个字节的内存。但是我们类中有很多成员,它们需要存储在某地方,当我们决定开始使用这个对象时,我们会创建一堆变量,对象有一堆变量,我们需要在电脑的某个地方分配内存,这样我们就可以记住这些变量设置的值。

应用程序会将内存主要分为两部分,栈和堆,还有其他部分的内存,比如源代码的区域。

在C++中我们要选择对象要放在哪里,对象是在栈上还是在堆上创建,它们有不同的功能差异。

栈:栈对象有一个自动的生存期,他们的生存期实际上是由它声明的地方的作用域决定的,只要变量超出作用域,也就是说内存被释放了,因为当作用域结束的时候,栈会弹出作用域里面的东西,栈上的任何东西会被释放。

堆:一旦在堆中分配一个对象,实际上你已经在堆上创建了一个对象,它会一直待在那里,直到你做出决定,确定不需要它,想要释放这个对象,那怎末处理这段内存都行。
 

代码案例:

在栈上创建: 

在什么时候在栈上创建对象?

几乎所有的时候,如果你能像这样在栈上创建对象,那就像这样创建对象,因为这是C++中最快的方法,也是可以管控的方法,去初始化对象

某些情况下不能这么做的原因?

1、如果将实例化对象放到main函数的生存期外

void Function(){int a = 2;Entity entity;}

一旦到达函数结尾的花括号,这个entity会从内存中被销毁
当我们在main函数中调用Function时,就为这个函数创建了一个栈结构,它包含了我们声明的所有局部变量,其中包括基本类型,也包括我们的类和对象,当函数结束时,栈帧会被销毁,即栈上所有的内存,所有创建的变量都消失了

如果想让括号{}内的实例化对象在作用域之外依然存在,就不能分配到栈上,需要使用堆分配。

2、如果entity的规模太大,可能有太多的entity,可能没有足够的空间在栈上分配,因为栈通常非常小,通常是1M/2M

# include <iostream>
# include <string>
using namespace std;class Entity
{
private:string m_Name;  //只有一个成员,是一个字符串
public:Entity() : m_Name("Unknown") {}Entity(const string& name) : m_Name(name) {}const string& GetName() const { return m_Name; }
};int main()
{// 1、在栈上创建Entity entity; // 实际上调用了默认构造函数Entity() : m_Name("Unknown")cout << entity.GetName() << endl;Entity entity1("chen");// 等价于 Entity entity1 = Entity("chen")cout << entity1.GetName() << endl;/*在什么时候在栈上创建对象?几乎所有的时候如果你能像这样在栈上创建对象,那就像这样创建对象,因为这是C++中最快的方法,也是可以管控的方法,去初始化对象某些情况下不能这么做的原因?1、如果将实例化对象放到main函数的生存期外void Function(){int a = 2;Entity entity;}一旦到达这个花括号,这个entity会从内存中被销毁当我们调用Function时,就为这个函数创建了一个栈结构,它包含了我们声明的所有局部变量,其中包括基本类型,也包括我们的类和对象,当函数结束时,栈帧会被销毁,即栈上所有的内存,所有创建的变量都消失了Entity* e;{Entity entity2("cherno");e = &entity2;cout << entity2.GetName() << endl;} 一旦出了{}作用域,就到达了栈端,entity2对象就已经不存在了如果想让括号{}内的实例化对象在作用域之外依然存在,就不能分配到栈上,需要使用堆分配cin.get();return 0;
}

在堆上创建:

在堆上创建,首先要做的就是在改变类型,将Entity改成Entity*,通过new关键字,这里最大的区别不是那个类型变成了指针,而是new关键字,new关键字是关键。

Entity* entity = new Entity("cherno");当我们调用new Entity时,会在栈上分配内存,调用构造函数,这个new Entity实际上会返回一个Entity*,它会返回entity在堆上被分配的内存地址。

使用new关键字必须调用delete释放内存

delete + 变量名:delete entity;

性能问题:在堆上分配要比栈花费更长的时间,而且在堆上分配的话,您必须手动释放被分配的内存

# include <iostream>
# include <string>
using namespace std;class Entity
{
private:string m_Name;  //只有一个成员,是一个字符串
public:Entity() : m_Name("Unknown") {}Entity(const string& name) : m_Name(name) {}const string& GetName() const { return m_Name; }
};int main()
{// 2、在堆上创建/*在堆上创建,首先要做的就是在改变类型,将Entity改成Entity*,通过new关键字,这里最大的区别不是那个类型变成了指针,而是new关键字,new关键字是关键当我们调用new Entity时,会在栈上分配内存,调用构造函数,这个new Entity实际上会返回一个Entity*,它会返回entity在堆上被分配的内存地址*/Entity* entity = new Entity("cherno");//释放内存//delete 变量名;delete entity;/*性能问题:在堆上分配要比栈花费更长的时间,而且在堆上分配的话,您必须手动释放被分配的内存*/cin.get();return 0;
}

创建对象的两种方法,如何选择?

如果对象太大,或者需要显示地控制对象的生存期,那就是用堆创建,其他情况就是用栈创建。

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

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

相关文章

【扩散模型】生成模型中的Residual Self-Attention UNet 以及 DDPM的pytorch代码

参考&#xff1a; [1] https://github.com/xiaohu2015/nngen/blob/main/models/diffusion_models/ddpm_cifar10.ipynb [2] https://www.bilibili.com/video/BV1we4y1H7gG/?spm_id_from333.337.search-card.all.click&vd_source9e9b4b6471a6e98c3e756ce7f41eb134 TOC 1 UNe…

视黄酸诱导基因-1敲除诱导树突状细胞的不成熟特性并延长异体移植小鼠的存活时间研究【AbMole】

器官移植是一种用于替换因疾病、损伤或其他原因受损的人体器官的医疗程序。尽管器官移植可以挽救生命并显著提高生活质量&#xff0c;但存在供体器官短缺、排斥反应、器官功能障碍、感染和药物副作用等问题。为了提高移植成功率和受体健康&#xff0c;需要有效的免疫策略。树突…

如何使用支付宝沙箱环境本地配置模拟支付并实现公网远程访问【内网穿透】

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境…

原理篇-- 定时任务xxl-job-服务端(admin)项目启动过程--JobFailMonitorHelper初始化 (5)

文章目录 前言一、JobFailMonitorHelper作用&#xff1a;二、JobFailMonitorHelper源码内容&#xff1a;2.1 start() 初始化2.1.1 任务失败重试:2.1.2 任务失败告警信息发送:2.1.2.1 JobAlarmer 告警类&#xff1a;2.1.2.2 alarm 告警信息发送&#xff1a; 2.2 toStop() 终止线…

数据可视化原理-腾讯-3D网格热力图

在做数据分析类的产品功能设计时&#xff0c;经常用到可视化方式&#xff0c;挖掘数据价值&#xff0c;表达数据的内在规律与特征展示给客户。 可是作为一个产品经理&#xff0c;&#xff08;1&#xff09;如果不能够掌握各类可视化图形的含义&#xff0c;就不知道哪类数据该用…

壁炉火焰温和而宁静,警惕火焰凶猛的潜在危害

在寒冷的冬夜&#xff0c;壁炉散发的温暖和闪烁的火焰成为家庭的心灵港湾。然而&#xff0c;我们在享受壁炉带来的温馨时&#xff0c;有时候也要关注火焰的凶猛度&#xff0c;因为它可能引发一系列潜在危害。 首先&#xff0c;壁炉的火焰过于凶猛可能导致空气质量下降。当火焰过…

从零开始手写RPC框架(4)

这一节主要讲述网络传输模块的代码&#xff0c;并且几乎每一行代码都加上了我个人理解的注释&#xff0c;同时也讲述了其中一些以前没见过的函数&#xff0c;和大致的底层运行逻辑。 目录 网络传输实体类网络传输实现基于Socket实现网络传输基于Netty实现网络传输客户端服务端 …

【JavaEE进阶】 Linux常用命令

文章目录 &#x1f343;前言&#x1f334;ls 与 pwd&#x1f6a9;ls&#x1f6a9;pwd &#x1f38d;cd&#x1f6a9;认识Linux目录结构 &#x1f340;touch与cat&#x1f6a9;touch&#x1f6a9;cat &#x1f332;mkdir与rm&#x1f6a9;mkdir&#x1f6a9;rm &#x1f384;cp与…

GD库没有安装FreeType 支持Call to undefined function App\Services\imagettfbbox()

GD库是一个功能强大的图像处理库&#xff0c;广泛用于生成和处理图像。然而&#xff0c;默认情况下&#xff0c;GD库不包含FreeType扩展&#xff0c;该扩展用于处理字体和文本。如果您需要在GD库中使用更多的字体和文本效果&#xff0c;您可以按照以下步骤安装和启用FreeType扩…

十五、单词造句

描述 GG Bond在和妹妹做一个游戏&#xff0c;GG Bond给定了妹妹一些单词字符串&#xff0c;他想让妹妹把这些单词拼接成以空格间隔开的句子&#xff0c;很可惜妹妹Python没有学好&#xff0c;你能使用join函数帮帮她吗&#xff1f; 输入描述&#xff1a; 多行输入多个字符串…

Java基础 - 7 - 常用API(二)

API&#xff08;全称 Application Programming Interface&#xff1a;应用程序编程接口&#xff09; API就是Java帮我们已经写好的一些程序&#xff0c;如类、方法等&#xff0c;可以直接拿过来用 JDK8 API文档&#xff1a;Java Platform SE 8 一. Object Object类的作用 Ob…

mybatis多数据源切换

1.前提 项目中有可能需要去其他的数据库取其他的表的信息 2.思路 2.1 直接使用原生jdbc&#xff08;不推荐&#xff09; 2.2 不使用我们全局配置的mybatis&#xff0c;对指定文件夹下使用我们指定的Session 3.解决办法 指定该配置的范围 package com.maycur.openapi.dao.my…

『Linux从入门到精通』第 ㉓ 期 - 管道

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;进程间通信的目的&#x1f427;如何进行进程间通信&#x1f427;进程间通信的分类&#x1f427;管道&#x1f426;什么是管道&#x1f426;管道原理 &#x1f427;实例代码&#x1f427;管道的特点&#x1f4…

Protobuf学习笔记以及序列化的一些概念要点(暂放C++笔记专栏)

Protobuf学习笔记以及序列化的一些概念要点 —— 杭州 2024-03-03 文章目录 Protobuf学习笔记以及序列化的一些概念要点1.Protobuf概念2.实际测试2.1.准备一个test.proto2.2.使用 protoc 命令行工具来编译一个 Protocol Buffers 文件 test.proto3.3.创建一个main.cpp写C++代码…

mysql 事务的隔离级别

一、事务的隔离级别要解决的问题&#xff1a; 1&#xff09;脏读&#xff1a;读到了其它事务未提交的数据即脏读&#xff0c;未提交意味着数据有可能会被回滚&#xff0c;也就是最终有可能不会存储到数据库中&#xff0c;即读到了最终不一定存在存在的数据&#xff0c;即为脏读…

如何选择程序员职业赛道:挑战与机遇并存的职业探索指南

程序员如何选择职业赛道&#xff1f; 作为程序员&#xff0c;选择职业赛道是一项重要的决策&#xff0c;不仅影响你的职业发展&#xff0c;也影响着你的工作生活。本文将为你介绍如何选择程序员职业赛道&#xff0c;以及每个方向的特点、挑战和机遇&#xff0c;帮助你做出明智…

《极客时间 - 左耳听风》【文章笔记 + 个人思考】

《极客时间 - 左耳听风》 原文链接 &#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 备注&#xff1a;加粗部分为个人思考 01 | 程序员如何用技术变现&#xff1f;&#xff08;上&#xff09; 备注&#xff1a;加粗部分为个人思考) 01 | 程序员如何…

Window系统部署Splunk Enterprise并结合内网穿透实现远程访问本地服务

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步&#xff0c;结合cpolar内网穿透工具实现随时随地在任意浏览器&#xff0c;远程访问在本地…

【24最新版PythonPycharm安装教程】小白保姆级别安装教程

今天&#xff0c;我就来教大家一下&#xff0c;如何去安装Python&#xff01; 需要博主打包好的一键激活版Pycharm&&Python也可扫下方直接获取 ​ 1 了解Python Python是一种面向对象的解释型计算机程序设计语言&#xff0c;由荷兰人Guido van Rossum于1989年发明&…

[C++]使用纯opencv去部署yolov9的onnx模型

【介绍】 部署 YOLOv9 ONNX 模型在 OpenCV 的 C 环境中涉及一系列步骤。以下是一个简化的部署方案概述&#xff0c;以及相关的文案。 部署方案概述&#xff1a; 模型准备&#xff1a;首先&#xff0c;你需要确保你有 YOLOv9 的 ONNX 模型文件。这个文件包含了模型的结构和权…