C++中类内的成员变量和成员函数分开存储,只有非静态成员变量才存储在类的对象上

news/2026/1/17 11:01:39/文章来源:https://www.cnblogs.com/blj28/p/19495375

C++中类内的成员变量和成员函数分开存储,只有非静态成员变量才存储在类的对象上

 
你想理解的核心是:在 C++ 中,一个类的对象占用的内存空间,只包含它的非静态成员变量,而成员函数和静态成员变量是所有对象共享的,并不占用单个对象的内存。这个概念是理解 C++ 类内存布局的关键。

一、用通俗的比喻理解

可以把类想象成一个工厂的设计图纸,对象就是根据图纸生产出来的具体产品:
  • 非静态成员变量:相当于每个产品独有的属性(比如手机的序列号、颜色),每个产品都有一份,占用产品自身的空间。
  • 成员函数:相当于图纸上标注的 “使用方法”(比如手机的 “打电话” 功能),所有产品都遵循同一个方法,图纸只需要一份,不需要每个产品都带一份。
  • 静态成员变量:相当于工厂的 “公共库存”(比如生产的手机总数),属于工厂所有,不是某个产品的属性,所有产品共享这个数值。

二、分点详细解释 & 代码验证

1. 非静态成员变量:属于对象,占用对象内存

每个对象的非静态成员变量都是独立的,修改一个对象的非静态成员变量,不会影响其他对象。对象的内存大小,本质上就是所有非静态成员变量的大小之和(可能有内存对齐,略大)。
代码验证:
 
#include <iostream>
using namespace std;class Phone {
public:// 非静态成员变量:每个对象独有string color;  // 字符串类型,占用内存int price;     // 整型,4字节(32/64位系统)// 成员函数(非静态)void call() {cout << "打电话" << endl;}
};int main() {Phone p1;p1.color = "白色";p1.price = 5999;Phone p2;p2.color = "黑色";p2.price = 6999;// 输出对象占用的内存大小(包含color和price,因string是复杂类型,大小固定为8字节(64位)+4字节=12字节,内存对齐后可能为16字节)cout << "单个Phone对象的大小:" << sizeof(p1) << endl;return 0;
}
 
输出(64 位系统):
plaintext
 
单个Phone对象的大小:16
 
可以看到,对象的大小只和非静态成员变量有关,完全不包含成员函数的大小。

2. 成员函数:所有对象共享,不占用对象内存

不管类有多少个成员函数,也不管创建了多少个对象,这些成员函数的代码只在内存中存在一份。当调用对象的成员函数时,编译器会隐式地把对象的地址传给函数(通过this指针),函数再通过this访问该对象的非静态成员变量
关键证明:即使给类添加多个成员函数,对象的内存大小也不会变:
 
class Phone {
public:string color;int price;void call() {}void sendMsg() {}void takePhoto() {}
};int main() {// 大小依然是16字节(仅包含color和price)cout << sizeof(Phone) << endl; return 0;
}

 

3. 静态成员变量:所有对象共享,不占用对象内存

静态成员变量用static修饰,属于类本身,而不是某个对象。它在程序启动时就分配内存,所有对象都访问同一份静态成员变量。
代码验证:
 
class Phone {
public:string color;int price;static int totalCount;  // 静态成员变量:记录生产的手机总数
Phone() {totalCount++;  // 每创建一个对象,总数+1
    }
};// 静态成员变量必须在类外初始化
int Phone::totalCount = 0;int main() {Phone p1;Phone p2;Phone p3;// 所有对象共享totalCount,输出3cout << "手机总数:" << Phone::totalCount << endl;// 对象的大小依然是16字节,不包含totalCountcout << "对象大小:" << sizeof(p1) << endl;return 0;
}

 

 
输出:
plaintext
 
 
手机总数:3
对象大小:16
 

三、特殊情况:空类

如果一个类没有任何非静态成员变量(空类),C++ 为了区分不同对象的地址,会给空类分配1 字节的内存,而成员函数依然不占用这 1 字节。
 
class Empty {
public:void func() {}  // 成员函数不占用对象内存
};int main() {cout << sizeof(Empty) << endl;  // 输出1return 0;
}

 

总结

  1. 非静态成员变量:属于单个对象,是对象内存的核心组成部分,修改一个对象的非静态成员变量不会影响其他对象。
  2. 成员函数(无论是否静态):所有对象共享一份代码,不占用单个对象的内存,非静态成员函数通过this指针关联到具体对象。
  3. 静态成员变量:属于类本身,所有对象共享,不占用单个对象的内存,需在类外初始化。
这个规则的核心目的是节省内存—— 如果每个对象都存储一份成员函数代码,会造成极大的内存浪费,而共享函数代码、仅存储独有的数据(非静态成员变量)是最高效的设计。
 

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

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

相关文章

1.4 评估指标与可解释性:如何科学评价你的AI模型

1.4 评估指标与可解释性:如何科学评价你的AI模型 引言 在前几节中,我们学习了机器学习的基础知识、深度学习的核心概念以及如何使用PyTorch构建图像分类项目。然而,仅仅构建模型是不够的,我们还需要科学地评估模型的性能,并理解模型是如何做出决策的。本节将详细介绍各种…

Managerial communication

Managerial communicationProcedure to come up with High Level estimationWBS to come up with estimate of staff months, (e.g. 42 manmonths) devided by num of people working full time (e.g. 6) comes up to…

2.1 Transformer解密:自注意力机制与位置编码全解析

2.1 Transformer解密:自注意力机制与位置编码全解析 引言 Transformer架构自2017年提出以来,彻底改变了自然语言处理领域,并成为当今大语言模型(LLM)的基础架构。从BERT到GPT,从T5到PaLM,几乎所有现代大模型都基于Transformer架构。在本节中,我们将深入解析Transform…

完善我的第一个工作流: 增加循环逻辑

1、复制工作流 我们复制 [COZE打造自己的第一个工作流:新闻搜索与总结] 中实现的news工作流,在news工作流的基础上进行修改,实现循环逻辑。 2、添加链接读取插件 (增加新闻详细程度) 在 根据关键词搜索新闻内容 插件的下一步中增加 链接读取插件 选择 链接读取插件 然后添…

攻克边缘设备AI部署:基于Jetson Nano的YOLOv5零基础部署与性能调优实战

【从零到一】Jetson Nano上YOLOv5部署完全攻略:零基础小白也能玩转边缘AI推理 文章目录 【从零到一】Jetson Nano上YOLOv5部署完全攻略:零基础小白也能玩转边缘AI推理 1. 引言:为什么选择Jetson Nano? 1.1 边缘AI时代的到来 1.2 YOLO系列模型的优势 1.3 本教程的特色 2. 硬…

2.2 预训练模型全家桶:BERT、T5、GPT如何选择与应用

2.2 预训练模型全家桶:BERT、T5、GPT如何选择与应用 引言 在上一节中,我们深入解析了Transformer的核心机制,包括自注意力和位置编码。基于Transformer架构,研究者们开发出了众多优秀的预训练模型,其中最具代表性的就是BERT、T5和GPT系列。这些模型在各种自然语言处理任…

完善我的第一个工作流: 增加批处理

接着上篇文章 [完善我的第一个工作流: 增加循环逻辑] 继续分析 这里我们继续打开上篇文章创建的工作流 news_manuscript ,进行完善。 批处理就是并行做事 循环就是串行做事 1、增加批处理节点 这样就添加成功了 2、配置批处理节点参数 这里的输入参数我们选择上个节点抓取…

RK3588嵌入式AI工业部署:YOLOv11 + OpenCV实时推理系统全栈实现

文章目录 从0到1:RK3588部署YOLOv11并结合OpenCV实现实时推理全流程(保姆级教程) 一、前置知识与工具准备 工具清单 二、PT模型转ONNX格式 步骤1:准备YOLOv11的PT模型文件 步骤2:执行转换命令 三、ONNX模型转RKNN格式 步骤1:搭建转换环境 步骤2:编写转换脚本 步骤3:执行…

COZE打造我的第一个智能体

1、创建智能体 智能体相当于你的秘书,你只需要告诉你的秘书需要做什么事情即可 应用就是界面操作,点击一个按钮执行什么东西,再点击一个按钮又执行什么东西 2、智能体配置 2.1、模型选择及模型能力 模型的多轮能力配置: 2.2、工作流配置 找到我们自己发布的工作流,并添…

1.1 揭秘AI入门必修课:从零搭建电商SKU智能分类系统

1.1 揭秘AI入门必修课:从零搭建电商SKU智能分类系统 引言 在人工智能技术飞速发展的今天,电商行业面临着海量商品管理和分类的挑战。传统的手动分类方式已经无法满足现代电商平台的需求。本章将带你从零开始,构建一个电商SKU(Stock Keeping Unit)智能分类系统,帮助你掌…

2.3 LoRA微调黑科技:低成本定制专属大模型

2.3 LoRA微调黑科技:低成本定制专属大模型 引言 在前两节中,我们学习了Transformer的核心机制和主流预训练模型(BERT、GPT、T5)。虽然这些预训练模型功能强大,但直接对整个模型进行微调需要巨大的计算资源和存储空间。特别是在大模型时代,微调一个拥有数十亿甚至数千亿…

2026年有实力的移动岗亭实力厂家选哪家,户外站岗岗亭/岗亭/移动岗亭/岗亭环保厕所,移动岗亭批发哪家好 - 品牌推荐师

随着城市化进程加速与公共设施需求的多元化,移动岗亭作为灵活、高效的场景化解决方案,正从单一功能向模块化、智能化、定制化方向演进。尤其在西北地区,政企采购、景区升级、社区改造等场景对移动岗亭的工艺标准、适…

发布我的第一个智能体到终端应用

完成调试后,单击发布将智能体发布到各种渠道中,在终端应用中使用智能体。目前支持将智能体发布到飞书、微信、抖音、豆包等多个渠道中,你可以根据个人需求和业务场景选择合适的渠道。 1、智能体发布平台选择 目前支持这些平台 这里我们选择发布到飞书以及微信订阅号 2、发…

2.4 RAG检索增强生成:让你的大模型拥有外部知识库

2.4 RAG检索增强生成:让你的大模型拥有外部知识库 引言 在前面的课程中,我们学习了Transformer架构、预训练模型家族以及LoRA等参数高效微调技术。然而,即使是最先进的大语言模型也存在一个重要局限:它们只能利用训练时学到的知识,无法访问训练完成后的新信息。 RAG(R…

2026年橡胶制品加工定做实力供应商排名,河北楠铭橡塑表现亮眼 - 工业品牌热点

2026年工业制造领域持续向精密化、定制化转型,橡塑制品作为设备密封、防护、减震的核心基础件,其加工定做的专业度直接影响整机稳定性与运行成本。无论是标准橡胶塞、硅胶O型圈的批量供应,还是复杂橡胶异形件的定制…

COZE打造我的第一个工作流:新闻搜索与总结

1、进入扣子编程/资源库 2、选择工作流 工作流名称:名称随便写,但是不支持中文 工作流描述:比如 (输入一个要查询的内容,帮我总结好报告) 点击确认后就进入到工作流编辑界面了 3、工作流编辑 3.1、添加插件节点 (爬取信息) 比如这里我们选择添加 头条搜索。选择添加头条搜…

YOLO26 核心模块精讲:SKAttention 如何实现动态感受野与通道自适应

文章目录 第一部分:创建和修改文件 1. 创建 `ultralytics\nn\SK.py` 2. 创建 `ultralytics\cfg\models\v8\yolov8-SK.yaml` 3. 修改 `ultralytics\nn\tasks.py` 第二部分:SKAttention 的原理介绍 深度解读 SKAttention:选择性核注意力机制 1. 引言:注意力机制在深度学习中的…

Development Manager - Management Routine

Development Manager - Management RoutineManagement WiseCapacity /Staffing PlanInputproduct contact background product project functional and non functional requirement, time schedule requirement backlo…

如何在 Python 中使用 Jupyter Kernel 运行代码并获取输出

在这篇文章中&#xff0c;我们将介绍如何在 Python 中使用 jupyter_client 包来启动 Jupyter Kernel&#xff0c;并通过它执行代码并获取输出。使用 Jupyter Kernel 是一种非常强大的方式&#xff0c;可以让你在 Python 程序中动态执行代码并获取结果。 下面是实现这一过程的详…

YOLO26 注意力机制解析:SKAttention 的动态感受野自适应原理与实现详解

文章目录 第一部分:创建和修改文件 1. 创建 `ultralytics\nn\SK.py` 2. 创建 `ultralytics\cfg\models\v8\yolov8-SK.yaml` 3. 修改 `ultralytics\nn\tasks.py` 第二部分:SKAttention 的原理介绍 深度解读 SKAttention:选择性核注意力机制 1. 引言:注意力机制在深度学习中的…