static关键字的作用

static关键字在C++中有哪些作用 修饰类的成员变量和函数时,实现了类成员的共享和通过类名直接访问的功能。- 类的静态成员函数只能访问类的静态成员变量和其他静态成员函数,不能直接访问非静态成员,因为非静态成员依赖于具体的类对象,而静态成员函数不依赖于类对象调用。- 类的静态成员变量被所有类对象共享,存储在静态存储区,不占用类对象的内存空间,可通过类名直接访问,常用于表示类的公共属性或统计信息。- static 修饰函数时,函数的作用域被限定在当前源文件中,其他源文件不能调用该函数,可避免函数名在不同源文件中冲突。 阅读详情


C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为 6 种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

1. 全局静态变量

定义:在全局变量前加上关键字static;
内存中的位置:静态存储区;
初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);
作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。

2. 局部静态变量

定义:在局部变量前加上关键字static;
内存中的位置:静态存储区;
初始化:未经初始化的局部静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);
作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。这种变量在程序执行之前就创建,在程序执行的整个周期都存在。

3. 静态函数

定义:在函数返回类型前加static;
作用域:函数的定义和声明在默认情况下都是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。函数的实现使用static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突;
注意:

  1. 不要在头文件中声明static的全局函数(变量),原因是:包含了该头文件的所有源文件中都定义了这些函数(变量),即该头文件被包含了多少次,这些函数(变量)就定义了多少次。
  2. 不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则cpp内部声明需加上static修饰。

4. 类的静态成员

在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。

  • 对多个对象来说,静态数据成员只存储一处,供所有对象共用,包括派生类的对象。
  • 静态成员变量是在类内进行声明,在类外进行定义和初始化,在类外进行定义和初始化的时候不要出现 static 关键字和private、public、protected 访问规则。
  • 静态成员变量可以作为成员函数的参数,而普通成员变量不可以。
lass A
{
public:
    static int s_var;
    int var;
    void fun1(int i = s_var); // 正确,静态成员变量可以作为成员函数的参数
    void fun2(int i = var);   //  error: invalid use of non-static data member 'A::var'
};
  • 静态数据成员的类型可以是所属类的类型,而普通数据成员的类型只能是该类类型的指针或引用。
class A
{
public:
    static A s_var; // 正确,静态数据成员
    A var;          // error: field 'var' has incomplete type 'A'
    A *p;           // 正确,指针
    A &var1;        // 正确,引用
};

5. 类的静态成员函数

在静态成员函数的实现中不能直接引用类中说明的非静态成员,因为静态成员函数没有 this 指针,可以引用类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。从中可看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>);
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。静态成员函数不能声明成虚函数(virtual)、const 函数和volatile函数(volatile的作用就是用来进行多线程编程。在单线程中那就是只能起到限制编译器优化的作用)。
注:

  • 不能将静态成员函数定义成虚函数:静态成员函数属于类,而虚函数必须根据对象类型才能知道调用哪一个虚函数,故虚函数是一定要在对象的基础上才可以。
  • 不可以同时用const和static修饰成员函数:C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。

注:

  1. 从分配内存空间看:
    静态存储区:全局变量,静态局部变量,静态全局变量。
    栈:局部变量。
  2. 静态变量和栈变量(存储在栈中的变量)、堆变量(存储在堆中的变量)的区别:静态变量会被放在程序的静态数据存储区(.data 段)中(静态变量会自动初始化),这样可以在下一次调用的时候还可以保持原来的赋值。而栈变量或堆变量不能保证在下一次调用的时候依然保持原来的值。
  3. 静态变量和全局变量的区别:静态变量用 static 告知编译器,自己仅仅在变量的作用范围内可见。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用 extern 关键字再次声明这个全局变量。

补充:

  • volatile 的作用:当对象的值可能在程序的控制或检测之外被改变时,应该将该对象声明为 violatile,告知编译器不应对这样的对象进行优化。

  • volatile不具有原子性。

  • volatile 对编译器的影响:使用该关键字后,编译器不会对相应的对象进行优化,即不会将变量从内存缓存到寄存器中,防止多个线程有可能使用内存中的变量,又有可能使用寄存器中的变量,从而导致程序错误。

使用 volatile 关键字的场景:

  • 当多个线程都会用到某一变量,并且该变量的值有可能发生改变时,需要用 volatile 关键字对该变量进行修饰;
  • 中断服务程序中访问的变量或并行设备的硬件寄存器的变量,最好用 volatile 关键字修饰。

volatile 关键字和 const 关键字可以同时使用,某种类型可以既是 volatile 又是 const ,同时具有二者的属性。

6. C 和 C++ static 的区别

  • 在 C 语言中,使用 static 可以定义局部静态变量、外部静态变量、静态函数
  • 在 C++ 中,使用 static 可以定义局部静态变量、外部静态变量、静态函数、静态成员变量和静态成员函数。因为 C++ 中有类的概念,静态成员变量、静态成员函数都是与类有关的概念。
基于YOLOv8的野生菌菇检测、识别与分类系统 YOLOv8是YOLO系列模型的最新版本,继承了YOLO系列高效、精确的特点。YOLOv8采用了新的网络架构,并优化了推理速度和检测精度。与传统的目标检测算法(如Faster R-CNN)不同,YOLO模型通过一次前向传播同时完成目标定位与分类,因而具有非常高的计算效率。 阅读详情

相关推荐

C#实战:手把手教你用SerialPort实现RS485 ModbusRTU通信(附完整代码)

本文详细介绍了如何使用C#的SerialPort类实现RS485 ModbusRTU通信,包括硬件准备、串口配置、数据收发核心逻辑及高级通信技巧。通过实战案例和完整代码,帮助开发者快速掌握工业级通信框架的构建方法,提升设备间通信的稳定性和效率。

weixin_29207533的博客 254

static关键字有什么作用

目录 static关键字有什么作用 (1) static 成员变量 (2)static成员方法 (3) static 代码块 (4)static内部类 引申: 1.什么是实例变量?什么是局部变量?什么是类变量?什么是 final 变量? 2.static 与 final 结合使用表示什么意思? static关键字有什么作用 static 关键字主要有两种作用:第一,为某特定数据类型或对象分配单一的存储空间,而 与创建对象的个数无关。第二,实现某个方法或属性与类...

m0_65562481的博客 1万+

告别Vivado自带编辑器!手把手教你用Sublime Text 4 + Icarus Verilog搭建FPGA开发环境(Windows 10/11)

本文详细介绍如何在Windows 10/11系统下,使用Sublime Text 4和Icarus Verilog搭建高效的FPGA开发环境,替代Vivado自带编辑器。通过配置语法检查、代码高亮和智能补全等功能,提升Verilog开发效率,实现专业级工作流。

weixin_30684743的博客 427

QT - static用法

C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Example 1 #include void fn(); static int n; //定义静态全局变量 void main() { n=20; cout&l

lhh_qrsly的博客 4390

逆向工程师的Shopee爬虫避坑指南:af-ac-enc-dat参数生成原理与反反爬策略

本文深入剖析了Shopee电商平台的反爬虫加密机制,重点解析了核心请求头参数x-sap-ri、x-sap-sec及af-ac-enc-dat的生成原理与联动关系。文章从逆向工程视角,提供了定位加密代码、分析算法逻辑的实战方法,并分享了基于JS执行环境模拟与无头浏览器控制的可持续反反爬策略,为高效、稳定地采集数据提供专业指南。

weixin_28607671的博客 1492

uniapp 基于单选框多选框实现上拉触底多选/单选、回显

showPickerCheckbox弹层显示 label和value 类似下拉框的label和value一个意思 键和值。结果:可以传接口(接口只能post请求) 可以搜索 下面是结果图片展示 单选多选都可以。fieldValue回显传的值 传的是字符串 数组的话[1,2]转为1,2格式传入。mode是控制的单选还是多选 true为多选默认值 其余参数 单选多选一样。fieldName字段名 确定后会返回该字段名 根据字段名找对应的传入值。问题:在uniapp上 实现分页多选的操作。下面是组件的完整代码。

2301_76607997的博客 2936

static 关键字的作用

本文目录:写在前面:静态变量和静态方法: Ⅰ.static关键字最基本的用法是: 写在前面:        之前讲到 final 关键字的作用是每次面试的时候必问求职者的两个问题之一,另外一个问题就是文本会写到的static。final 和static一样,都是一个小问题。但是却可以看到一个人的基础是否扎实以及平时是否...

扛麻袋的少年的博客 1446

嵌入式下载故障排查:ST-LINK与GD32 Programmer典型问题解决

嵌入式固件烧录是MCU开发的关键环节,其本质依赖于调试器(如ST-LINK、GD-Link)与目标芯片间的协议通信、驱动加载及硬件接口协同。原理上,SWD/JTAG协议需在正确时序、电平与供电条件下完成设备枚举、ID读取与Flash编程;技术价值在于保障量产烧录稳定性与调试可重复性;典型应用场景涵盖STM32/GD32教学开发、工业控制板量产调试及Windows 11新系统适配。本文聚焦ST-LINK-V2在Keil MDK中的下载失败和GD32 All In One Programmer的DLL加载异常两

weixin_35006125的博客 153

关键字static的作用

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

zzyzgg的博客 6万+

Camunda流程引擎 Modeler (二)

Camunda Modeler是Camunda官方提供的建模器: 独立安装的建模器([windows、linux、mac]

1311

双有源桥DC-DC变换器:原理、软开关与移相控制深度解析

隔离型DC-DC变换器是电力电子系统的核心部件,通过高频变压器实现电气隔离与电压匹配,保障系统安全与灵活适配。其工作原理基于功率半导体器件的开关动作,通过调制策略控制能量传输。该技术的核心价值在于实现高效、高功率密度的电能转换,并支持双向能量流动,这对于提升系统整体能效和运行灵活性至关重要。在新能源储能、电动汽车V2G及数据中心供电等场景中,双向能量流成为刚性需求,推动了如双有源桥等先进拓扑的应用。本文聚焦于双有源桥这一实现高效双向隔离变换的“明星”方案,深入剖析其利用移相控制实现软开关的机理。通过分析谐振

weixin_34195142的博客 378

C++ static关键字作用

C++ static关键字作用 1.static修饰全局变量 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。 未加static的全局变量,在符号表中是global符号,其他目标文件可见,这样的符号是要参与符号解析的。加了static之后,是local符号,其他目标文件不可见,只在当前文件中可见,不参与符号解析过程。所以多个源文件可以定义...

ll148305879的博客 1万+

基于51单片机的电子记分牌的设计

基于51单片机的电子记分牌的设计 电子记分牌基于51单片机的电子记分牌的设计摘要1 引言2 总体设计方案2.1 设计思路(1)设计要求(2)设计思路(3)设计方案2.3综合设计方框图(1)硬件设计框图(2)软件设计3 设计原理分析3.1 电源、复位、下载电路的设计(见图1、2、3)3.2 时钟电路的设计3.3 矩阵键盘电路的设计3.4 数码管显示电路设计4程序代码 摘要 本设计为电子记分牌设计,是以STC89C52芯片为核心,辅以必要电路设计进行的。用4位LED七段数码管显示比赛两方的分数(每方分数用2位

行走的皮卡丘 2037

java中static关键字的作用_C++ static关键字到底有什么作用

在文章开头先写总结吧,省的文章太长大家看的又晕。简单总结下来static关键字具有以下两点作用:改变变量的生命周期和限定作用域1、改变变量的生命周期我们都知道在函数中申明的局部变量在函数调用完成后即会被释放,但是由static申明的局部变量的生存周期是长于函数的,也就是说即使函数调用结束后该变量的内存也不会被释放。下面我们直接看代码:#include #include void func(){in...

weixin_39528697的博客 120

efm32 入门.pdf

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

static关键字的作用详解

平时工作中static关键字出现的地方挺多的,但是要我说出他们的用法跟区别我还真不知道怎么说,这里系统性的整理下。 static关键字的作用(修饰类、方法、变量、静态块) 1、修饰函数的局部变量: 特点:有默认值0,只执行一次,运行一开始就开辟了内存,内存放在全局 2、修饰全局函数和全局变量: 特点:只能在本源文件使用 3、修饰类里面的成员变量: 特点:和1差不多,定义多个static y,但只有一个y,不进入类的大小计算,不依赖于类对象的存在而存在(可直接调用,要进行外置声明) 4、修饰.

酷爱编程的小猿同学 9426

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java中static关键字的作用与用法

写在前面 这篇总结一下Java中static关键字的作用与用法。 参考文献如下: [java]static关键字的四种用法 Java中static关键字的作用 Java中的static关键字解析 Java中static关键字的作用 下面直接分析static关键字的四种基本用法。 修饰成员变量 平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性...

zy2317878的博客 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++ static关键字作用讲解

一、隐藏作用 指的是加static关键字的变量只在源文件cpp中起作用,无法在其中文件中被调用。 举例来说明: 分别创建两个cpp文件。一个是main函数所处的cpp 一个是自己定义的demo.cpp demo.cpp代码如下:里面主要是定义了一个char类型字符a和msg函数 #include "stdafx.h" char a ='a'; void msg(){ std::co...

MusicMan 1892

static关键字的作用是什么

static关键字的作用: 1、修饰函数的局部变量 有默认值0,只du执行一次,运行一开始就开zhi辟了内存,内存放在全局 2、修饰全局函数和全局变量 只能在本源文件使用 3、修饰类里面的成员变量 和1差不多,定义多个static y,但只有一个y,不进入类的大小计算,不依赖于类对象的存在而存在(可直接调用,要进行外置声明) 4、修饰类的成员函数 f():括号里无this指针,只能调用他的本类静态函数和他的静态变量,即是用static修饰过的不依赖于类对象的存在而存在(可不进行外置声明,直接调用) stat

此人很懒,什么都没有写 8899

static关键字的作用_详解static inline关键字

详解static inline关键字本文章为知乎用户 @徐yang哟 原创,禁止抄袭!灵感来源在查stm32的LL库部分函数的API时,有时会查到这种函数: __STATIC_INLINE void LL_GPIO_SetPinOutputType ( GPIO_TypeDef * GPIOx, uint32_t PinMask, uint32_t OutputType);我不禁对__...

weixin_39848347的博客 1633

关键字static的作用是什么?

static关键子的作用

m0_64886876的博客 6497

C++ static关键字的作用

1. 隐藏功能(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,而加入static的变量仅在当前文件可见。 举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。 //a.c char a = 'A'; // global variable void msg() { printf("Hello\n"); } //main.c int main() { extern char a; // exter

年年年的博客 2059

C++中static关键字作用总结

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。 //a.c char a = 'A'; // global variable void msg() { printf("Hello\n"); } ...

Wang Bei的博客 6257

Static 关键字有什么作用?

static关键字是编程中的核心概念,用于修饰变量、方法和代码块。静态变量具有全局生命周期,存储在静态区,被所有实例共享;静态方法可直接通过类名调用,但不能访问非静态成员。静态代码块在类加载时初始化静态资源。内存方面,静态成员常驻方法区(如Java),通常不被GC回收。典型应用包括单例模式、常量定义(结合final)及工具类。需注意线程安全(需同步)、避免滥用导致耦合,且静态方法不支持多态。不同语言实现差异:C/C++侧重作用域控制,Java/C#强调类级限制。

2403_87639585的博客 483

C语言static关键字的作用(有三个作用)

1.具有隐藏的作用 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 2.保持变量内容的持久 变量不加 static 修饰: #include <stdio.h> void test() { int num = 0; num++; printf("%d ", num); } int main() { int i = 0; for (i = 0; i < 10; i++) {

weixin_49303682的博客 9357

static关键字、const关键字的作用

static关键字、const关键字的作用

qq_58871929的博客 1958
上一篇: C++中extern关键字使用
下一篇: c++中四种cast转换
GoodLinGL
博客等级 码龄6年 120粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值