C++中static、const、static const修饰变量作用详解

C++ static与const用法详解 目录 static的作用: 对普通变量: 1.局部变量: 2.全局变量 对类中变量: 1.成员变量 2.成员函数 const的作用: static的作用: 对普通变量: 1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。 1)内存中的位置:静态存储区 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用... 阅读详情

C++中类的变量可以通过static、const、static const来修饰,不同的修饰在不同的情况下表示不同的含义。下面我们来详细解读一下他们的用处。

首先我们需要先了解程序运行期间的内存分区:

1.代码区:存放CPU指令码。

2.常量区:存放只读常量,该区只读,不可写。

3.静态区:存放静态变量。该区在程序编译完成后就决定了其大小,程序运行期间该区的大小不会变。该区可读写。

4.动态区:又分为堆区和栈区,程序运行期间其大小处于动态变化中。处于该区的变量也会时而被创建时而被销毁。


static关键字:

经过static修饰的变量会作为类的属性而不是实体属性存在。

static修饰的变量作为程序运行时的静态变量,存在于内存的静态区,静态区的数据初始化工作由操作系统在加载完程序后执行main函数前进行。操作系统在加载完程序后,将常量区中存放的变量初值复制给静态变量,完成其初始化。

static修饰的变量通过int ClassName::value=1这种方式进行初始化。此时不再需要static 关键字。程序运行期间也可以对变量进行赋值操作。

const关键字:

经过const修饰的属性,顾名思义是指常量。

const修饰的属性仍然属于实体属性,所以其初始化工作,需要由构造函数的初始化列表中完成。而且也只能在构造函数的初始化列表中初始化,运行期间将不能再对const属性进行修改。值得注意的是,虽然经过const修饰,但是因为变量属于实体属性,而实体对象存在于动态区,所以const属性也属于动态区,所以可以通过取址直接操作指向的内存的值,以绕过编译器对其只读的限制检查。

static const关键字:

static const 和 const static 含义相同。

static const有两种用法,一种是作为预编译声明,一种是作为类的静态常量属性。

当作为预编译声明时,static const 属性必须在声明时即指定值,而且类型仅限基本数据类型。用法如下:

class A

{

static const int a =1;

}

此时相当于C语言中的 #define a 1 宏定义了一个宏变量a,但是C++的这种方式比C的#define的优势在于,可以对类型进行检查和限制,减少了编译期间因为类型隐士转换而造成的潜在风险。

此时的 const static常量既不存在于动态区也不存在与静态区(应该是存在于常量区或代码区。。。),而是由编译器在编译期间就直接进行了值替换。也因为这个原因不可以对其进行取地址操作,因为他根本没有地址。

另一种用法是作为类的静态常量属性,此时,不能在类的声明处进行初始化。而需要通过 int ClassName::value = 1;的方式进行初始化赋值。

const static常量存在于内存的常量区,有操作系统加载程序时,加载到内存的常量区。所以可以对其取址,但是不能对该区的内存进行写操作,因为这个区从操作系统级进行了只读限定,任何对该内存区的写操作会导致程序崩溃。


总结:

static const 作为预编译声明使用时,相当于C的#define,但是需要编译器进行类型检查,保证了程序的健壮性。此时其只能用基本数据类型。

static const 作为类的常量属性,因为常量区是在程序真正执行代码前进行初始化,所以其也必须是基本数据类型。

static const 和const的区别是:

const声明的只读变量,在程序运行期间不能对其进行写操作,写操作将无法通过编译,也就是说它是通过编译器控制的只读,所以如果想下面这样:

A a;

int * pa = (int*)&a.a;

*pa = 2;

则可以绕过编译器修改他的值。

但是 static const属性虽然也可以取址,但是对其写操作将会导致程序崩溃。因为static const 存在于常量区,而const存在于动态区。

static const 和 static的区别是,static 存在于静态区,该区可以进行写操作,其初始化的值也会存在常量区,程序启动后由操作系统从常量区取值赋值给static变量。 

const和static的作用以及区别 Static: 存储方式: 定义一个static变量时,编译器会在静态存储区为它分配空间,而不是在栈上。 1. static变量如果声明在函数体中,它的作用范围是整个函数体。 需要注意它只会分配一次内存。所以多次调用这个函数不会多次给static变量重新赋值。因此它的值会保持上次调用时的值。 2. static变量如果声明在模块中,它的作用范围是这个模块中的所有函数。它可以被这个模 阅读详情

相关推荐

embedding计算过程

文章目录embedding计算过程(错了跟我讲,我会改)参考示例个人理解过程图示总结(基于pytorch) embedding计算过程(错了跟我讲,我会改) 参考示例 https://www.jianshu.com/p/63e7acc5e890 个人理解过程图示 总结(基于pytorch) 总的来说,就是将独热向量的长度(对应嵌入层的num_embeddings)转变为嵌入层的emdedding_size(而独热向量的维数就是你的数据中一共产生了多少个不一样的词,至少是这么多)。 数据的变化,将二维

纸上得来终觉浅,绝知此事要躬行! 1630

详解const、static关键字

由以上代码可以看出,在没有static修饰的时候每一次调用test函数,函数中i的值都会重新赋值,而当i变量由static修饰的时候,在test结束之后并没有被销毁,下次调用test函数时i的值仍然是上次调用时i++的值。我们在编写函数的过程中,如果要写出优秀的代码,那么在编写函数的过程中就要尽量的使用const修饰,这样可以避免当我们想要传入的参数不被修改时而不小心被修改导致bug的出现,增加了代码的可用性以及目的性。用const修饰函数,主要是防止在传参的时候,在被传入的函数中传入的参数被修改。

lin_95的博客 1万+

QMI8658A和QMC5883L传感器校准全攻略:从零偏校准到椭球拟合

本文详细解析了QMI8658A和QMC5883L传感器的校准方法,从零偏校准到椭球拟合,涵盖了9轴运动传感器的核心误差来源及补偿技术。通过实战案例和数学建模,帮助开发者提升传感器精度,适用于无人机、AR/VR等智能硬件应用。

weixin_29189381的博客 157

static和const的作用与区别

我们先来说static. static主要有三个作用: 1.修饰局部变量,成为静态局部变量 2.修饰全局变量,成为静态全局变量 3.修饰函数,成为静态函数 我们一个一个来解释. 1.修饰局部变量。成为静态局部变量 我们先来看下面这一段程序: #include<stdio.h> void test() { int a = 5; a++; printf("%d", a); } int main() { int i = 0; while (i < 10) { t

weixin_47257473的博客 2万+

远程桌面(RDP)共享USB设备全攻略:不止Hyper-V,你的加密狗和CH340串口也能远程用

本文详细介绍了远程桌面(RDP)共享USB设备的完整解决方案,包括加密狗和CH340串口设备的远程使用技巧。通过RemoteFX USB重定向技术,用户可以在远程会话中无缝使用本地USB设备,提升工作效率。文章涵盖企业级配置、典型设备实战案例及高级故障排除方法,是远程工作者的实用指南。

weixin_42522964的博客 332

ISP算法:宽动态HDR

动态范围(Dynamic Range):在很多领域来表示某个变量的最大值和最小值的比值。在数字图像处理领域里,动态范围也被称为图像对比度,表示图像可以显示范围内,像素最大亮度值和最小亮度值的比值。 高动态范围图像(High Dynamic Range Image): 可以反映真实场景中高动态范围亮度信息图像。 高动态技术:能自动调整图像动态范围的一种技术。该技术是一种利用计算机高速运算产生高

a200800170331的专栏 1万+

C++中的 const和static 以及 static const 和const static

对于C/C++语言来讲,const就是只读的意思,只在声明中使用;static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内函数可见. const定义的常量在函数执行之后其空间会被释放,而static...

mhjie1998的博客 3215

YOLOv8推理程序

YOLOv8单独推理,有时候我们自定义的模块算子无法正常转换为其他框架,而且需要做成应用,因此需要一个单独推理的程序,返回的是识别后的照片还有各个类别及其对应数量。文章最后给出Flask封装为Server以及调用的实例还有Client请求代码,支持几十路多线程并发,只需加载一次模型,后边推理即可。

AIOT魔法师 698

const与static的区别

对于C/C++来说,就是只读的意思,只在声明中使用,意即其所修饰的对象为常量((immutable)),它不能被修改,并存放在常量区。一般有两个作用,规定作用域和存储方式(静态存储)。对于局部变量,static规定其为静态存储方式每次调用的初始值为上一次调用后的值,调用结束后存储空间不释放;对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见,对于static函数也是如此。static修饰的变量如果没有初始化,则默认为0.

量变产生质变 1万+

【推荐100个unity插件】动画重定向,快速在不同角色间共享动画,共用非人形Humanoid(泛型generic)动画——Retarget Pro

Retarget Pro是一款高效的Unity动画重定向工具,可快速在不同角色间共享动画。主要特点包括:1分钟快速设置,支持编辑器和运行时重定向;适用于人形、动物、武器等各类角色;提供基础重定向、IK重定向和FPS专用重定向三种功能模块;通过Rig组件和骨架资产实现骨骼链匹配,支持批量处理。插件包含示例项目和预设资源,操作简便且效果优于Unity原生Humanoid系统,特别适合处理手指等精细动画。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 545

YOLO小目标检测优化:9种实用方案,准确率直接提升15%

小目标检测是个系统工程,没有银弹,但有明确的优化路径。优先搞数据。Copy-Paste + 提升分辨率,这俩加起来成本最低、收益最大,能解决80%的小目标问题。别一上来就改模型结构。调参走在改结构前面。锚框聚类、损失加权、增强优化,这些都是零成本的,先做满了再说改模型的事。P2层是大杀器,但不要轻易用。加了P2层,TensorRT部署、后处理、速度都要跟着调,工程化工作量翻倍。数据和训练做到位还不够,再加也不迟。滑动窗口是兜底的。能从训练端解决的问题,就不要拖到推理端。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 186

C++中static、const、static const修饰变量作用详解(转)

C++中static、const、static const修饰变量作用详解C++中类的变量可以通过static、const、static const来修饰,不同的修饰在不同的情况下表示不同的含义。下面7少带大家一块详细解读一下他们的用处。首先我们需要先了解程序运行期间的内存分区: 代码区:存放CPU指令码。 常量区:存放只读常量,该区只读,不可写。 静态区:存放静态变量。该区在程序编译完成后就决定了

crazy_father的博客 712

Python遥感图像处理应用篇(二十三):Python+GDAL 批量拼接图像

遥感影像拼接分多种不同的情况,比如比较常用的是两幅影像拼接或者多个图像合并为一个图像。GDAL中实现影像拼接的方式也有多种,比如常用可以通过numpy读取影像数组,并计算各个图像的numpy数组范围,合并多个numpy数组为一个最终的结果,并将其重新输出为一幅新的图像,即可实现图像的拼接。另外比较方便的一种方法便是使用GDAL.warp()函数方法。这个函数的功能很多,可以实现多种不同的目的,比如用于坐标系转换、投影变换、图像合并与镶嵌、地理范围裁剪、更改分辨率、矢量裁剪等多种功能。这些功能可以通过设置Op

soderayer的博客 4641

关键字static的作用

1、 关键字static的作用是什么? 正确答案: 这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3). 在模块内,一个被声明为静态的函数只可被这...

zzyzgg的博客 6万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++中 const 修饰普通类型,修饰指针变量

Test t(8);Cmf(t);return 0;// 返回一个 const 自定义类型对象// 获取 const 自定义类型对象// 可以访问成员,但不能修改// 以下代码会报错,因为 obj 是 const 对象,不能修改return 0;

down_and_out的博客 973

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C++】const和static的用法

本文介绍了C++中const与static关键字的用法及其结合应用。const主要用于限制变量/对象的可修改性,包括修饰普通变量、指针、函数参数/返回值、类成员和对象等场景。static则用于改变变量/函数的存储周期或作用域,包括修饰全局变量、局部变量以及类成员变量/函数。两者的结合应用主要体现在"类的静态常量"(static const)上,用于定义类级别的共享且不可修改的常量。文章通过具体代码示例详细说明了各种用法,帮助读者理解这两个关键字的正确使用方式。

2402_88461821的博客 1534

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

const和static能同时修饰成员函数吗

static的作用: 对变量: 1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。 1)内存中的位置:静态存储区 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。 注:当static用来修饰局部变量的时...

weixin_41066529的博客 3996

const与static

const与static的理解

qq_61605392的博客 1914

C++中的const static this

前面我们说到了C++中的类创建,其中类包括了函数,变量,以及构造函数,但是和C语言当中一样,我们对变量和函数有const和static修饰,在C语言当中我们用const修饰变量表示不可修改的变量,那么在C++中是不是也是这样呢?明确告诉大家,有共同点也有不同点,大多是不同的

2301_78622258的博客 1385

【c++】static, const 修饰

一、static修饰类的成员 static特点: static数据存储在数据段, 生命周期最长--进程开始到结束, 数据只分配一次空间(初始化一次) 1.初始化一次 2.文件作用域 3.数据存在数据段,只分配一次空间 1.修饰成员变量 a. 静态成员数据空间不包含在对象空间里 b. 在类外初始化 //初始化静态成员变量 intData::number=0;//初始化-...

Jason的技术探索与分享 583

const和static

const允许我们指定一个语义约束,编译器会强制执行这个约束,告诉编译器和其他程序员某值不应该被改变,当某个值确定不可被改变时,我们就应该使用constoperator*声明式: const Rational operator*(const Rational& lhs, const Rational& rhs); Rational a, b, c; (a * b) = c; if (a * b = c) ... 本意可能是判断 a*b 和 c 是否相等,如果不加const,写成=的情况下

kleincode的博客 1423

C++ 变量作用域 & 存储期 & 链接性:const / static / extern 全面解析

本文详细解析了C++中const、static和extern三种变量作用域关键字的核心用法与区别。const提供只读语义保护数据(区分顶层/底层const),static可延长变量生命周期或限制作用域(局部静态/文件静态/类静态),extern则实现跨文件引用。文章通过代码示例展示了三者在函数参数、成员变量、多文件工程中的典型应用场景,并指出常见误区(如const全局变量默认内部链接)。最后总结了工程实践中的最佳用法组合,包括公共常量定义、模块封装和C/C++互调方案,为开发者提供了一套可直接套用的编程模式

冰冻三尺非一日之寒 1075

static 和const分别怎么用

6.static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗? static的作用: 对变量: 1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。 1)内存中的位置:静态存储区 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3)作用域:作用...

zzyzgg的博客 4814

【C++】static、const、constexpr、全局变量、局部变量

const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。 static static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。在C++中,static静态成员变量不能在...

weixin_41646851的博客 5960
上一篇: C++中Override
下一篇: C++之static及其作用域
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值