c++类的静态成员变量和非静态成员变量定义和初始化为什么有区别?

news2024/11/28 0:45:00

类的静态成员变量和非静态成员变量定义和初始化为什么有区别?

我的理解是如果静态成员变量在类里定义的话,也就是每一个类的实例化对象都有这个静态成员变量的大小,也就违背了静态成员变量属于类,只有一份拷贝

在这里插入图片描述

静态成员变量和非静态成员变量之间的区别主要是由于它们的用途和作用域的不同。这些区别反映了C++语言设计中的一些基本原则和目的。

  1. 作用域和生命周期

    • 静态成员变量属于整个类,而不是类的某个特定实例。它们在所有对象实例之间共享。因此,静态成员变量只需要在全局范围内定义一次,并且它们的生命周期贯穿整个程序运行过程。
    • 非静态成员变量则是属于类的每个实例。每个对象实例都有自己的成员变量副本。这些成员变量的生命周期与对象实例的生命周期相同。
  2. 内存分配

    • 静态成员变量在程序启动时分配内存,并在程序终止时释放。由于它们不属于任何特定的类实例,因此它们的内存分配是独立于任何对象的。
    • 非静态成员变量在创建类的对象实例时分配内存,当对象实例被销毁时,这些成员变量的内存也随之释放。
  3. 设计目的

    • 静态成员变量用于那些需要跨多个对象共享的数据。例如,你可能想要跟踪一个类的所有实例的数量,或者有一个配置值应用于所有实例。
    • 非静态成员变量用于存储每个对象实例的独立数据。它们代表了对象的状态。
  4. 初始化方式

    • 静态成员变量可以在类外初始化,确保了全局唯一性和初始化时的灵活性。
    • 非静态成员变量通常在构造函数中初始化,这与对象的创建密切相关。

这些区别使得静态和非静态成员变量能够适用于不同的编程场景,提供了灵活性和效率,这是C++语言设计的一部分。通过这种方式,C++允许开发者根据不同的需求和上下文来选择合适的数据存储和访问策略。

为什么const static int的成员变量可以在类里定义和初始化呢

在C++中,const static int 类型的成员变量可以在类内部定义和初始化的原因与这些变量的特性有关:

  1. 静态成员变量:静态成员变量属于类本身,而不是类的任何具体实例。这意味着它们在程序的整个生命周期内只有一份拷贝,无论你创建了多少个类的实例。

  2. 整数类型的常量表达式:整数类型的常量表达式在编译时已经确定其值,因此它们不需要在每个对象中都有一份拷贝。这使得它们可以在类定义中直接初始化。

  3. 内存分配与链接:由于const static int 成员是常量,编译器可以在编译时将其分配到程序的只读数据段中。这意味着它们不需要在运行时动态分配内存。因此,即使它们定义在类内部,也不会导致每个对象实例的大小增加。

  4. C++标准:C++标准允许在类内部初始化整型静态常量数据成员。这是因为这些成员是不可修改的,并且它们的值在编译时就已确定。这种方式简化了代码,使得相关的常量定义和初始化可以在类定义中紧密结合,提高了代码的可读性和维护性。

举个例子,如果你有一个类MyClass,你可以在类内部定义和初始化一个const static int 成员变量,如下所示:

class MyClass {
public:
    const static int myConst = 42;
};

这里,myConst 是一个属于MyClass的静态成员变量,它在所有MyClass实例之间共享,并且在整个程序的生命周期内保持不变。由于它是一个编译时常量,因此可以在类定义内初始化。

因此,即使它们定义在类内部,也不会导致每个对象实例的大小增加。 这句话什么意思?

这句话的意思是,当你在类内部定义一个 const static int 成员变量时,它不会影响到类的每个实例的内存大小。这是因为静态成员变量不是存储在对象实例中的,而是独立于任何特定实例存在的。

在C++中,每个对象实例通常包含其所有非静态成员变量的副本。这意味着这些成员变量的大小会直接影响到每个实例的总内存占用。然而,静态成员变量的情况不同。无论创建了多少个实例,静态成员变量只有一份拷贝,并且它存储在所有实例之外的位置。

因此,当我们说“即使它们定义在类内部,也不会导致每个对象实例的大小增加”时,我们的意思是,这个 const static int 成员变量不会因为存在于类定义中而增加单个对象实例的内存占用。这与非静态成员变量相反,后者会随着每个对象实例分别占用内存空间。

简而言之,类的静态成员变量的内存分配与类的实例无关,因此不会影响类实例的大小。

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

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

相关文章

python-基础篇-高级变量类型

文章目录 高级变量类型目标知识点回顾 01. 列表1.1 列表的定义1.2 列表常用操作del 关键字(科普)关键字、函数和方法(科普) 1.3 循环遍历1.4 **应用场景** 02. 元组2.1 元组的定义创建空元组元组中 **只包含一个元素** 时&#xf…

记录一个sql:查询商品码对应多个商品的商品码

目录 背景sql 语句总结 背景 一个项目中,商品表和商品码表是一对多的关系,但由于程序没有控制好,导致有些商品码对应有多个商品,为了修正数据,我们得把商品码对应多个商品的商品码找出来. sql 语句 goods_detail表结构…

INTEWORK—PET 汽车软件持续集成平台

产品概述 INTEWORK-PET-CI是经纬恒润自主研发的汽车软件持续集成&持续交付平台,在传统的持续集成基础上深化了研运一体化(DevOps)的概念,将嵌入式软件中的拉取代码、检查、构建、测试、版本管理以及发布交付等环节串联起来&am…

【EFCore仓储模式】介绍一个EFCore的Repository实现

阅读本文你的收获 了解仓储模式及泛型仓储的优点学会封装泛型仓储的一般设计思路学习在ASP.NET Core WebAPI项目中使用EntityFrameworkCore.Data.Repository 本文中的案例是微软EntityFrameworkCore的一个仓储模式实现,这个仓储库不是我自己写的,而是使…

接口自动化框架搭建-写在前面

从今天开始,我将带领大家一起学习接口自动化框架的搭建,在学习之前,我们先了解搭建一个接口自动化框架需要具备哪些知识,应该做哪些准备工作 测试开发工程师的入门条件 近几年比较流行测试开发岗位,很多小伙伴都不知…

虚拟机安装宝塔的坑

问题: 在虚拟机中centos7和centos8中安装宝塔之后,无法访问面板。 解决: 1.先关闭防火墙(如果本机能够ping通相关端口,则不用关闭防火墙) 2.最新的宝塔会自动开启ssl协议,需要手动关闭。…

【深度学习】BasicSR训练过程记录

文章目录 两种灵活的使用场景项目结构概览简化的使用方式 项目结构解读1. 代码的入口和训练的准备工作2. data和model的创建2.1 dataloader创建2.2 model的创建 3. 训练过程 动态实例化的历史演进1. If-else判断2. 动态实例化3. REGISTER注册机制 REGISTER注册机制的实现1. DAT…

反序列化提升刷题(2)

今天的例题&#xff1a; <?phphighlight_file(__FILE__);class ctfshowvip{public $username;public $password;public $code;public function __construct($u,$p){$this->username$u;$this->password$p;}public function __wakeup(){if($this->username! || $thi…

2008年苏州大学837复试机试C语言

2008年苏州大学复试机试C 题目 编写程序充成以下功能: 一、从键盘上输入随机变量x的 10个取样点。X0&#xff0c;X1—X9 的值; 1、计算样本平均值 2、判定x是否为等差数列 3、用以下公式计算z的值(t0.63) 注。请对程序中必要地方进行注释 补充&#xff1a;个人觉得这个题目回…

macOS修改默认时区显示中国时间

默认时区不是中国,显示时间不是中国时间 打开终端 ,删除旧区,并复制新时区到etcreb sudo -rm -rf /etc/localtime sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 重启系统后时间显示为中国时间

R 语言学习 case3:柱状图(ggchart)

主要涉及到对图的优化&#xff0c;使用ggchart工具包 ggchart 链接&#xff1a;https://thomas-neitmann.github.io/ggcharts/index.html step1: 安装工具包 install.packages("ggcharts") install.packages("tidytext")step2: 导入工具包 library(dplyr…

【游戏开发程序员必备技术】

【游戏开发程序员必备技术】 当你披着《英雄联盟》的战袍&#xff0c;挥舞着利剑&#xff0c;与对手不死不休地战斗&#xff1b; 当你驾驶着战车穿过《坦克世界》的烟尘弹雨&#xff0c;掩护基地免受敌人侵袭&#xff1b; 当你完美落地《CS&#xff1a;GO》的翻墙smoke&…

领航分布式消息系统:一起探索Apache Kafka的核心术语及其应用场景

本文是Kafka系列文章的第一篇&#xff0c;将带你了解Kafka的核心术语及其应用场景&#xff0c;后续会逐步探索其各方面的原理及应用场景。下面先看一张大概得简图&#xff0c;涉及Kafka的功能、原理等等&#xff0c;后续不断深入介绍&#xff0c;欢迎关注。 1、什么是消息中间…

unity 编辑器开发一些记录(遇到了更新)

1、封装Toggle组件 在用toggle等会状态改变的组件时&#xff0c;通过select GUILayout.Toggle(select, text, options)通常是这样做&#xff0c;但是往往有些复杂编辑器需求&#xff0c;当select变化时需要进行复杂的计算&#xff0c;所以不希望每帧去计算select应该的信息。…

muduo 网络库源码解析和使用

1. base 模块 1.1 API 1.1.1 eventfd int eventfd(unsigned int initval, int flags);&#xff08;1&#xff09;类似信号量&#xff1b;其内部保存了一个 uint64_t 计数器 count&#xff0c;使用 initval 初始化&#xff1b; &#xff08;2&#xff09;read 没有设置 EFD…

uniapp-app视频层级过高问题

使用v-html动态渲染 参考&#xff1a;uniapp video app端层级过高的问题&#xff0c;滑动渲染问题。_video在app端层级过高-CSDN博客 有想过使用原生&#xff0c;但是太麻烦了&#xff0c;然后换成了弹窗播放&#xff0c;但是动态的src播放失败&#xff0c;错误提示&#xff…

洋州影院购票系统:如何用Java、Spring Boot、Vue和MySQL实现现代化管理

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【高等数学之牛莱公式】

一、深入挖掘定积分 二、变限积分 三、变限积分的"天然"连续性 四、微积分基本定理 五、定积分基本方法 5.1、换元法 5.2、分部积分法 六、定积分经典结论 七、区间再现公式 八、三角函数积分变换公式 九、周期函数积分变换公式 十、分段函数求定积分

【MySQL】——关系数据库标准语言SQL(大纲)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

HCIA——18实验:NAT

学习目标&#xff1a; NAT 学习内容&#xff1a; NAT 1.要求——基本的 2.模型 3.IP分配、规划、优化 1&#xff09;思路 R2为ISP路由器&#xff0c;其上只能配置ip地址&#xff0c;不得冉进行其他的任何配置—ospf配置 认证 、汇总、沉默接口、加快收敛、缺省路由 PC1-PC2…