C++(9)—类和对象(上) ②实例化
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、实例化概念
- 二、对象大小
- 1.对象存储
- 2.内存对齐规则
- 总结
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、实例化概念
• ⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。
• 类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只
是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。
• ⼀个类可以实例化出多个对象,实例化出的对象 占⽤实际的物理空间,存储类成员变量。打个⽐
⽅:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多
少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房⼦,房
⼦才能住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。
在面向对象编程(OOP)中,实例化(Instantiation)是指创建一个类的实例的过程。这个实例,也称为对象,是类的具体化,拥有类定义的属性和行为。实例化使得抽象的类概念成为具有具体数据和功能的实体。
实例化过程包括以下几个关键点:
-
创建对象:在内存中分配空间以存储对象的状态(成员变量)。
-
初始化:设置对象的初始状态。这可能涉及到调用构造函数来初始化成员变量。
-
分配内存:对象可能在栈上(自动存储期)或堆上(动态存储期)创建。栈上的对象在作用域结束时自动销毁,而堆上的对象需要手动管理其生命周期。
实例化的例子:
class MyClass {
public:int value;MyClass(int val) : value(val) {} // 构造函数
};int main() {MyClass obj(10); // 在栈上实例化对象,初始化value为10MyClass* ptr = new MyClass(20); // 在堆上实例化对象,初始化value为20// 使用obj和ptr// ...delete ptr; // 释放堆上分配的内存return 0;
}
在这个例子中,我们定义了一个简单的类 MyClass,它有一个公有成员变量 value 和一个构造函数。在 main 函数中,我们实例化了两个 MyClass 对象:一个是栈上的对象 obj,另一个是堆上的对象 ptr。
实例化的特点:
-
栈上实例化:对象的生命周期与创建它的函数或代码块相同。当函数结束或代码块执行完毕时,对象会被自动销毁。
-
堆上实例化:对象的生命周期由程序员控制,需要使用
new操作符来创建对象,并使用delete来释放内存。这允许对象在创建它的函数之外存活。 -
默认构造函数:如果没有显式定义构造函数,编译器会提供一个默认构造函数,它不执行任何初始化。
-
拷贝构造函数:用于创建一个对象作为另一个同类型对象的副本。如果没有定义拷贝构造函数,编译器会提供一个默认的拷贝构造函数。
-
构造函数重载:可以为类定义多个构造函数,它们可以有不同的参数列表,这允许以不同的方式初始化对象。
实例化是面向对象编程中创建和使用对象的基本操作,它使得类的概念得以在程序中具体实现和操作。
#include<iostream>
using namespace std;
class Date
{
public:
void Init(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和d2
Date d1;
Date d2;
d1.Init(2024, 3, 31);
d1.Print();
d2.Init(2024, 7, 5);
d2.Print();
return 0;
}
二、对象大小
1.对象存储
这段内容讨论了C+++中对象大小的概念,特别是对象如何存储成员变量和成员函数,以及内存对齐规则对对象大小的影响。以下是对这段内容的总结:
对象存储方式设计
-
成员变量存储:对象中存储的是成员变量,这些变量是对象状态的具体表示。每个对象都有自己的成员变量副本,用于存储各自的数据。
-
成员函数存储:成员函数本身不存储在对象中。成员函数在编译后被转换为机器指令,存储在代码段中。对象中存储的是成员函数的地址(即函数指针),这些指针指向代码段中的函数实现。
-
函数指针:函数指针在编译时就已经确定,不需要在每个对象中重复存储。只有在动态多态的情况下,函数地址才需要在运行时确定,这时才需要存储函数地址。

2.内存对齐规则
内存对齐规则
-
第一个成员变量:在结构体或类中,第一个成员变量的偏移量为0。
-
其他成员变量:其他成员变量的地址需要对齐到某个数字(对齐数)的整数倍。这个对齐数是编译器默认的对齐数与成员变量大小的较小值。
-
编译器默认对齐数:在Visual Studio(VS)中,默认的对齐数为8字节。
-
结构体总大小:结构体的总大小是所有成员变量最大对齐数的整数倍。如果结构体中嵌套了其他结构体,那么嵌套的结构体也需要对齐到自己的最大对齐数。
#include<iostream>
using namespace std;
// 计算⼀下A/B/C实例化的对象是多⼤?
class A
{
public:
void Print()
{
cout << _ch << endl;
}
private:
char _ch;
int _i;
};
class B
{
public:
void Print()
{
//...
}
};
class C
{};
int main()
{
A a;
B b;
C c;
cout << sizeof(a) << endl;cout << sizeof(b) << endl;
cout << sizeof(c) << endl;
return 0;
}
总结
- 对象实例化时,只存储成员变量,不存储成员函数的代码。
- 成员函数的地址(函数指针)在对象中存储,用于调用成员函数。
- 内存对齐规则确保了成员变量的地址是其大小的整数倍,这有助于提高内存访问的效率。
- 结构体或类的大小由其成员变量的最大对齐数决定,以确保内存布局的效率。
这段内容强调了在设计类和结构体时,内存对齐是一个重要的考虑因素,它影响着对象的存储和性能。通过理解这些概念,开发者可以更好地控制对象的内存布局,优化程序的性能。
相关文章:
C++(9)—类和对象(上) ②实例化
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、实例化概念二、对象大小 1.对象存储2.内存对齐规则总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、实例化概念 • …...
Effective C++读书笔记——item2(const,enum,inlines取代#define)
关于用常量取代 #define 的总体原则 在编程中,应尽量减少预处理器(特别是 #define)的使用,可通过合适的替代方式来避免 #define 带来的诸多问题,虽然不能完全消除预处理器相关指令(如 #include、#ifdef/#i…...
如何科学评估与选择新版本 Python 编程语言和工具
文章目录 摘要引言评估新版本的关键因素适用性评估成本与收益分析 新版本功能的实际应用示例代码模块详细解析示例代码模块代码模块解析实际应用场景如何运行与配图 QA环节总结参考资料 摘要 随着技术的快速发展,编程语言和软件工具不断推出新版本,带来…...
第十届“挑战杯”大学生课外学术科技作品竞赛解析及资料
“挑战杯”被誉为大学生科技创新创业的“奥林匹克”盛会,它汇聚了来自各个学科、各个年级的精英人才。在这里,同学们带着对未知的好奇和对知识的渴望,组成一个个团队,向难题发起挑战。现在,第十届“挑战杯”大学生课外…...
【门铃工作原理】2021-12-25
缘由关于#门铃工作原理#的问题,如何解决?-嵌入式-CSDN问答 4 RST(复位)当此引脚接高电平时定时器工作,当此引脚接地时芯片复位,输出低电平。 按钮按下给电容器充电并相当与短路了R1改变了频率,按…...
Chain of Agents(COA):大型语言模型在长文本任务中的协作新范式
随着人工智能技术的飞速发展,大型语言模型(LLM)在自然语言处理领域的应用日益广泛。然而,LLM在处理长文本任务时仍面临诸多挑战。传统的解决方案,如截断输入上下文或使用基于检索增强生成(RAG)的…...
业务模型与UI设计
业务数据模型的设计、UI设计这应该是程序设计中不可缺少的部分。做程序设计的前提应该先把这两块设计好,那么,来一个实际案例,看看这2块的内容。 汽车保养记录业务模型与UI设计: 一、【车辆清单】 记录车辆相关的数据࿰…...
Apache SeaTunnel深度优化:CSV字段分割能力的增强
Apache SeaTunnel深度优化:CSV字段分割能力的增强 一、Apache SeaTunnel与CSV处理 1.1 Apache SeaTunnel简介 Apache SeaTunnel(原名Waterdrop)是一个分布式、高性能的数据集成平台,支持海量数据的实时同步。它允许用户通过配置…...
免费下载 | 2024年具身大模型关键技术与应用报告
这份报告的核心内容涉及具身智能的关键技术与应用,主要包括以下几个方面: 具身智能的定义与重要性: 具身智能是基于物理身体进行感知和行动的智能系统,通过与环境的交互获取信息、理解问题、做出决策并实现行动,产生智…...
SSM-Spring-AOP
目录 1 AOP实现步骤(以前打印当前系统的时间为例) 2 AOP工作流程 3 AOP核心概念 4 AOP配置管理 4-1 AOP切入点表达式 4-1-1 语法格式 4-1-2 通配符 4-2 AOP通知类型 五种通知类型 AOP通知获取数据 获取参数 获取返回值 获取异常 总结 5 …...
jenkins修改端口以及开机自启
修改Jenkins端口 方式一:通过配置文件修改(以CentOS为例) 找到配置文件:在CentOS系统中,通常可以在/etc/sysconfig/jenkins文件中修改Jenkins的配置。如果没有这个文件,也可以查看/etc/default/jenkins&…...
按照人们阅读Excel习惯来格式化BigDecimal
1、环境/问题描述 使用springboot发送邮件(附件)的方式将月度报表发送给领导查阅,数据是准确的,领导基本满意。 就是对一些数字的格式化提出了改进建议,比如不要让大数字自动转为科学计数法、浮点数小数点后都是0就不要带出来,根…...
IDEA开发Java应用的初始化设置
一、插件安装 如下图所示: 1、Alibaba Java Coding Guidelines 2.1.1 阿里开发者规范,可以帮忙本地自动扫描出不符合开发者规范的代码,甚至是代码漏洞提示。 右击项目,选择《编码规约扫描》,可以进行本地代码规范扫…...
Java网络套接字
在Java的开发中,有一个很重要!很重要!很重要!的东西,叫做网络套接字,它被广泛的用来二次开发服务,比如大数据中台的服务链路调用等。 它的实现原理是依靠三次握手来完成通信的建立,…...
2025差旅平台推荐:一体化降本30%
医药行业因其高度专业化的特点,同时在运营过程中又极为依赖供应链和销售网络,因此差旅管理往往成为成本控制的重要环节。本期,我们以差旅平台分贝通签约伙伴——某知名药企为例,探讨企业如何通过差旅一体化管理,在全流…...
多个DataV遍历生成
DataV是数据可视化工具 与Echart类似 相对Echart图标边框 装饰可选官网DataV 安装 npm install kjgl77/datav-vue3main.ts import DataVVue3 from kjgl77/datav-vue3 app.use(DataVVue3)多个DataV遍历生成 Vue3viteDataV为例:<template><div w50rem h25rem flex&qu…...
mysql_real_connect的概念和使用案例
mysql_real_connect 是 MySQL C API 中的一个函数,用于建立一个到 MySQL 数据库服务器的连接。这个函数尝试建立一个连接,并根据提供的参数进行连接设置。 概念 以下是 mysql_real_connect 函数的基本概念: 函数原型:MYSQL *my…...
Python性能分析深度解析:从`cProfile`到`line_profiler`的优化之路
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在软件开发过程中,性能优化是提升应用质量和用户体验的关键环节。Python作为广泛应用的高级编程语言,其性能分析工具为开发者提供了强大的…...
Momentum Contrast for Unsupervised Visual Representation Learning论文笔记
文章目录 论文地址动量队列对比学习的infoNCE loss为什么需要动量编码器对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同为什么动量编码器和梯度编码器不能完全相同?总结: 我理解,正负样本应该经过同一个encoder,…...
用户界面的UML建模07
4.2 抽象表示层的行为(Abstract Presentation Behaviour) AbstractForm 类定义了一组如下所示的四种操作: showForm() , getData() , sendConfirmation() 和sendCancellation()。在该阶段的设计过程(desig…...
利用Graphormer进行化学反应预测:从反应物到产物的智能推断
利用Graphormer进行化学反应预测:从反应物到产物的智能推断 1. 化学反应预测的挑战与机遇 有机化学合成是药物研发和材料科学的核心环节,但传统反应预测高度依赖化学家的经验。一个资深化学家可能需要花费数小时甚至数天时间,通过试错法来设…...
JL杰理AC696N系列开发GPIO使用指南:模式、配置与特殊IO
引言GPIO是嵌入式开发最基础也最容易出问题的部分。拉高拉低看起来简单,但驱动能力不够、上下拉没配对、特殊引脚没处理,经常导致外设工作不正常或者功耗异常。JL杰理AC696N的GPIO功能挺全的,有普通、强、超强三种驱动能力,还支持…...
思科故障排查命令 TOP50
在网络运维这行干久了,你会发现一个很现实的事情:90% 的故障,其实靠“几条命令”就能定位. 但问题是——很多人不是不会,而是: 想不起来用哪个命令 不知道该从哪一步查 查了但不会“看输出” 所以这篇文章,我不单是给你列命令,而是帮你建立一个: 👉 “排查思路 + 命…...
【Flutter for OpenHarmony 】三方库 infinite_scroll_pagination 鸿蒙化适配实战:列表分页加载全指南
📱 Flutter for OpenHarmony 三方库 infinite_scroll_pagination 鸿蒙化适配实战:列表分页加载全指南 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 哈喽大家好呀~我是一名正在学习Flutter跨平台开发…...
OpenClaw配置备份指南:千问3.5-27B模型迁移与快速恢复
OpenClaw配置备份指南:千问3.5-27B模型迁移与快速恢复 1. 为什么需要备份OpenClaw配置? 上周我的主力开发机突然硬盘故障,导致所有OpenClaw配置丢失。当时正在运行的3个自动化流程全部中断,最棘手的是那个每天凌晨自动整理技术文…...
实战分享:我是如何搞定SHEIN新版反爬(anti-in, smdeviceid, armortoken, x-gw-auth)的
电商平台数据采集实战:逆向工程与参数生成策略 最近半年,电商平台的反爬机制呈现出明显的升级趋势。以某国际快时尚电商为例,其新增的四个核心校验参数(anti-in、smdeviceid、armortoken、x-gw-auth)构成了完整的安全验…...
Wallpaper Engine下载器革新:突破创意工坊壁纸获取瓶颈的高效解决方案
Wallpaper Engine下载器革新:突破创意工坊壁纸获取瓶颈的高效解决方案 【免费下载链接】Wallpaper_Engine 一个便捷的创意工坊下载器 项目地址: https://gitcode.com/gh_mirrors/wa/Wallpaper_Engine 你是否曾因Steam创意工坊复杂的下载流程而放弃心仪的动态…...
Windows Cleaner智能清理引擎:全方位提速系统的开源解决方案
Windows Cleaner智能清理引擎:全方位提速系统的开源解决方案 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 在数字化办公环境中,系统优化…...
Amazon Q 从入门到实战,AWS 专属 AI 助手超全指南
目录 一、Amazon Q 到底是什么 二、Amazon Q 有两个版本 1、Amazon Q Developer(给开发者/运维) 2、Amazon Q Bussiness(给企业/业务人员) 三、Amazon Q能解决什么实际问题 四、Amazon Q 和 Chat GPT 同类助手的有什么区别 …...
别再手动整理PDF了!用PaddleOCR的PP-StructureV3,一键把合同/论文转成Markdown
告别手动整理:用PP-StructureV3实现合同/论文一键转Markdown的高效方案 每次面对堆积如山的合同扫描件或学术论文PDF时,你是否还在手工复制粘贴内容?当需要从复杂排版的文档中提取结构化数据时,传统OCR工具往往束手无策——表格变…...
