C/C++中的static关键字

掌握C/C++中的volatile, const, static, 和mutable关键字 volatile是C++中用来修饰类型为易变的变量,它告诉编译器不要对这个变量进行优化操作,以保证在多线程环境下,对变量的读取和写入都能及时地反映到其他线程的操作中。它主要用于那些在程序控制之外,由外部环境改变的变量,比如硬件寄存器的值、读写共享内存的变量等。volatile在类定义中,mutable关键字被用来修饰一个成员变量,这样即使该变量属于一个const对象,它也能够被修改。下面是一个简单的例子:public:// ...// 可以修改,即使在const成员函数中// ... 阅读详情

static的用法主要分为两大类,一种是在c语言中的用法,还有就是c++在类中的用法。

1. 在C语言中

1.1 修饰全局变量

定义静态全局变量就是在全局变量前加上 static 关键字

#include <iostream>
static int a = 10;	//这是静态全局变量
int main()
{
	return 0;
}

在这里插入图片描述
静态全局数据的特点:
1、静态全局变量就在全局数据段分配内存。
2、静态数据如果不初始化会被自动初始化为0
3、静态全局变量在声明它的整个文件都是可见的,在其他文件中不可见,它和extern的作用相反

static 的第三个特点还有个好处,就是可以防止命名污染,不用担心在别的文件中重复定义一个变量。

1.2 修饰局部变量

static 修饰的局部变量就是静态局部变量。静态局部变量和静态全局变量的共同点就是都是在全局数据区分配内存的。
局部变量的特点:
1、在全局数据区分配内存
2、静态局部变量在声明时初始化,如果用户没初始化,那么初值也会被初始化为0
3、当程序执行到局部变量的声明位置时被首次初始化,后面的函数再调用时不会初始化
4、它的作用域是局部的,只作用于该函数中,但是它的生命周期已经变为随程序了。因为它在全局数据区分配,所以生命周期变为整个程序,但出了函数范围,作用域结束。

举个栗子:

#include <stdio.h>
int i = 1;
void fun()
{
   	static int n = 0;
   	printf("执行了 %d 次\n", i);
   	printf("n 的值:%d\n", n);
   	i++;
   	n++;
}

int main()
{
   	fun();
   	fun();
   	fun();
   	fun();
   	return 0;
}

看起来每次执行函数都有初始化语句,但是static的作用就是只是在第一次声明的时候初始化,后面再次调用函数的时候,变量不会被初始化,对于这个函数变量会随着函数的调用次数而改变,所以结果如下:

在这里插入图片描述

1.3 修饰函数

在函数的返回类型前面加上 static 关键字就是静态函数了。
静态函数和普通函数的最大区别就是静态函数只能被本文件可见,不能被别的文件调用。这样也可以防止函数命名冲突。

 #include <stdlib.h>
static void fun()		//静态函数
{
   	printf("执行了 %d 次\n", i);
   	i++;
}

int main()
{
   	fun();
   	return 0;
}

2. 在C++中

  在 C++ 中,和C语言中不同的是C++对类成员进行的修饰。
声明为 static 的类成员就是类的静态成员,分别是静态成员变量和静态成员函数。
static修饰的成员变量就是静态成员变量;
static修饰的成员函数就是静态成员函数。

2.1 修饰类中成员变量

class Test
{
private:
   static int _count;
};
int Test::_count = 0;		//类外初始化
int main()
{
   Test::_count;	//没有创建对象也可以访问
   return 0;
}

类中的静态成员变量一定要在类外初始化,在类内直接初始化会报错;
为什么在类内初始化会报错?
答:因为程序中如果没有创建对象的话,定义类的代码是不会生成的。所以我们对一个不存在的东西赋值当然会报错!!

静态成员变量的特点:
1、类中静态成员为所有类对象所共享,不属于某个具体的实例,即静态成员变量只分配一次内存,供所有对象公用;
2、类中静态成员变量必须在类外定义,定义时不加 static 关键字;
3、类中静态成员变量的访问是通过【类名::静态成员变量】或【对象.静态成员变量】的方式来访问
4、类中静态成员变量也遵循 public、protected、private 的访问权限,以及 const 修饰符等;
5、类中静态成员变量是在全局数据区分配内存,不属于某一个类对象,而是属于本类所有的类对象,所以即便没有实例化对象,也可以通过【类名::静态成员变量】的方式访问.
6、应用场景:可以用于多个类具有相同的属性时,当所有类的这个属性都要更改时,那么只需要更改一处即可,而且静态成员变量只在全局数据区存储一份,更省空间。

静态成员变量和全局数据比较:

静态成员变量可以是private属性,而全局变量不可以,所以全局变量一定程度破坏了封装。
静态成员变量也可以减少命名冲突。

2.2 修饰类中成员函数

静态成员函数的特性:
1、类中静态成员函数的访问是通过【类名::静态成员变量】或【对象.静态成员变量】的方式来访问
2、类中静态成员函数也遵循 public、protected、private 的访问权限,也可以具有返回值以及 const 修饰符等;
3、类中静态成员函数中没有 this 指针,所以不能访问非静态成员函数,就因为它不是属于任何一个对象,所以没有this指针;
4、没有this指针,静态成员函数与全局函数相比效率会少许增长。

类中的函数一般都是有一个隐含的 this 指针,this指针指向类的对象本身,所以调用函数一般这样写fun();实际上是this->fun();

函数的调用:

class A
{
public:
	static int add()
	{}
};

int main()
{
	A a;
	a.add();	//通过对象调用静态成员函数
	A::add();	//通过类名::函数 调用静态成员函数
	return 0;
}

两个问题:

【问题1】:类的静态函数可以调用非静态函数吗?
答:不可以,静态成员函数之间可以互相访问,包括静态成员函数和静态成员变量。
因为在静态成员函数中调用非静态成员函数实际上要传参数,传this指针,但是静态函数并没有this指针,所以不能调。看看这段代码:

class test
{
public:
    static void staticfoo()
    {
        memfoo();
    }
    
    void memfoo()
    {}
}

int main()
{
    test::staticfoo();
    return 0;
}

以上是C++代码,翻译成C代码:

struct test
{
}
static void test_staticfoo()
 {
    memfoo(pthis);  //pthis 参数并不存在
}
 void memfoo(test* pthis)
{}

int main()
{
    test_staticfoo();
    return 0;
}

【问题2】:非静态函数可以调用类的静态函数吗?
答:可以,非静态函数可以随意的访问类的静态成员函数和静态成员变量。

龙虾 Skill 技能库|OpenClaw+Hermes 全集成 一键调用所有 AI 技能 龙虾 Skill 技能库、OpenClaw、Hermes Agent、AI 技能集成、本地 AI 自动化、办公工具、数字员工 阅读详情

相关推荐

100多台物理GPU服务器,每台服务器上有8张GPU卡,组网

计算网用 IB/RoCEv2 保证低延迟高带宽,支撑 800+GPU 的分布式训练;管理网和存储网独立部署,避免干扰核心通信;全链路冗余和规范布线,确保集群稳定运行;搭配 Slurm/K8s 和监控工具,实现高效管理。该方案可支撑千亿参数大模型训练,且具备极强的扩展性,未来可平滑扩容至 200 + 台服务器。

weixin_42795092的博客 2020

C语言中的 static变量、static函数

Static variable & function1、Static variable2、静态局部变量(static local variable)3、静态全局变量(static global variable)4、静态函数(static function)5、代码块(Code block) 1、Static variable        静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例

繁华落尽心殇 2736

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

命名冲突和static修饰符

  两个具有相同名称的外部对象实际代表的是同一个对象(即使用户并非本意)    static修饰符是一个能够减少此类命名冲突的工具,例如:  static int a;其含义与int a;相同,只不过a的作用于被限制在一个源文件内,而对于其他源文件,a是不可见的,如若干个函数需要共享一组外部对象,可以将这些函数放到一个源文件中,把他们需要用到的对象也都放在一个源文件中以static修饰,当然,st

郁郁 1156

Gazebo仿真UUV水下机器人:从环境搭建到避障算法实战

本文详细介绍了使用Gazebo仿真平台进行UUV水下机器人开发的全流程,涵盖从环境搭建、uuv_simulator配置、传感器集成到核心避障算法实战。通过搭建水下仿真实验室并实现基于激光雷达数据的反应式避障算法,为水下机器人算法验证与开发提供了高效、低成本的解决方案。

weixin_28840591的博客 263

基于STM32+OV7670的图像采集系统(基础篇:ov7670介绍)

一、简单认识 先来看一下外观: OV7670,图像传感器,体积小,工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB总线控制,可以输入整帧、子采样、取窗口等方式的各种分辨率8位影像数据。 其他介绍比较繁琐,这里就不一一赘述了,我们只需要知道它是通过SCCB总线控制的就行了。 带FIFO与不带FIFO 目前市场上购买的ov7670模块分为两种,一种是不带FIFO芯片、一种是带FIFO芯片的。 FIFO是什么:(First Input First Output)先入先出的意思,

m0_59113542的博客 4万+

C++ static详解

一、c/c++共有: 修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。 修饰局部变量时,表明该变量的值不会因为函数终止而丢失。 修饰函数时,表明该函数只在同一文件中调用。 1、全局静态变量: 用法:在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。 static int temp; 内存中的位置:静态存储区,在整个程序运行期间一直存在。 初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化); 作用域:全局静态变量在声明他的文件

芒种、的博客 1万+

mbed驱动st7789屏幕-硬件选择及连接(1)

在单片机项目中,交互性至关重要,而视觉感知是用户交互的直接体现。本期专栏介绍了如何使用mbed平台驱动ST7789型号的TFT屏幕,以显示字符、汉字和图像。由于针对STM32L432KC的mbed驱动库尚未完整,作者自行编写了一个基于mbed的ST7789屏幕驱动库,并将在专栏中提供全代码及使用指南。

weixin_64524066的博客 391

在 C/C++中 static 关键字详解

static 关键字详解 C/C++ 中的 static 1. 静态局部变量 2. 静态全局变量 全局变量 与extren 3. static 修饰函数 C++的 static 成员 静态成员变量 静态成员函数 总结: const修饰的静态变量

知识分享与学习笔记总结,欢迎指点 2万+

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 471

手把手教你学SOME/IP「3.2.1.发布/订阅行为」

本文详细介绍了SOME/IP协议中的服务发现机制,重点解析了发布/订阅行为的流程。主要内容包括:1)服务发布与Method通信流程,涵盖find/offer报文交互、TTL保活机制及异常处理;2)服务订阅与Event通信流程,包括subscribe/ack报文交互和组播延迟机制;3)特殊场景如快速发送、半周期回复、重置订阅等机制。通过邮局订阅报纸的类比,帮助理解服务发现的核心原理,并强调流程图对于问题定位的重要性。文章为SOME/IP协议的工程实现提供了实用指导。

nihaoljq2010的博客 1221

c++——static总结

前言 经过static修饰的变量,存储在内存的全局静态区。且被static修饰的变量只能在本模块的所有函数引用。 内存中的存储区域如下: 堆区:是由程序员手动申请(new)与释放(delete)的内存区域。从低地址向高地址申请;内存空间大、存储地址不连续,一般是链式的;速度较慢。 栈区:由编译器自动分配和释放,主要存储 函数的参数值、函数内部的变量的值、函数调用的空间。从高地址向低地址申请;容量有限;速度较快;存储地址连续,会溢出。 代码区:又叫文本段(.text),存放着程序的机器代码,可执行指令就

www_dong的博客 1万+

海洋CMS admin_notify.php 远程代码执行漏洞复现(CVE-2024-30565)

海洋CMS admin_notify.php 接口处存在远程代码执行漏洞,经过身份验证的远程攻击者可利用该漏洞执行任意代码,写入后门文件,进而控制整个web服务器。

0xSec 2713

static关键字在c/c++中的作用

c/c++中static的作用

Byersen的博客 2891

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C/C++中的static关键字详解

注:此篇博客取自https://www.cnblogs.com/qintangtao/p/3285937.html,原谅我的强迫症重新整理一下。 static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 在C中仅涉及到面向过程程序设计,C++中有面向过程和面向对象。 一.面向过程程序设...

qq_30024069的博客 256

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C/C++中的核心关键字:static extern const virtual volatile等

本文摘要:文章系统梳理了C/C++核心关键字及其特性。C语言部分重点解析了static的多重用途(变量生命周期控制、文件作用域限制)、const的跨语言差异、volatile的硬件交互特性、sizeof与strlen的区别,以及extern的跨文件调用机制。C++特有部分深入探讨了virtual实现的多态原理、new/delete与malloc/free的对象构造差异、this指针的隐式特性,以及template实现的泛型编程范式。通过对比C与C++关键字的异同(如const处理方式),揭示了两种语言在内存

nbwoshi的博客 344

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

static关键字在C/C++中的作用(详解)

static关键字在C/C++的作用:1.将变量声明为静态变量:静态变量会存储在程序的数据段中,也就是说不会在栈中分配,它的生命周期是全局的。 如果是局部静态变量,它的生命周期也是全局的并且只被初始化一次,但是作用域就仅仅是在定义的函数体中。 例子:#include <stdio.h>int count = 100; void func() { static int count = 10

Move_now的博客 1320

Static关键字在C/C++中的深入解析与应用指南

关键字在C和C++中扮演着重要角色,它不仅影响变量和函数的作用域,还与内存管理紧密相关。:可以不通过类的实例直接调用,常用于访问静态数据成员或实现与特定对象无关的类行为。:作为类的一部分,静态数据成员由所有对象共享,常用于跟踪类的状态或计数器。函数的作用域仅限于定义它的文件,这有助于避免命名冲突和提高代码的封装性。变量存储在静态存储区,有助于管理程序的内存使用,尤其是在多线程环境中。关键字与面向对象编程紧密结合,提供了类级别的数据和行为封装。的使用扩展到了面向对象编程的领域,增加了新的语义。

bill.chengzhi的博客 777

C/C++中的关键字static

一、static的历史术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。 随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。 最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的

weiwang1996的博客 306

简述static关键字在c/c++中的作用

在C语言中,关键字static有三个明显的作用: 1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。注意,只有在定义了变量后才能使用。如果变量定义在使用之后,要用extern 声明。所以,一般全局变量都会在文件的

1024350154--lj博客 1万+

深入理解C/C++中的static关键字及其应用场景

我尝试创建了几个演示项目,发现其实时预览功能特别适合观察变量生命周期变化,部署分享也很方便,对学习这类需要反复验证的概念很有帮助。:当static修饰局部变量时,会将其从栈区转移到静态存储区,生命周期延长至程序结束。:对全局变量和函数使用static时,会将其链接属性从外部改为内部,使得这些标识符仅在当前源文件可见,有效避免了多文件编程时的命名冲突问题。:静态变量(包括全局变量和static局部变量)会自动初始化为0值,这个特性在数组和字符串处理时能减少初始化工作量。演示了静态成员在状态跟踪中的应用。

GoldenleafTiger89的博客 906

static关键字C/C++中的使用

C++中static关键字的作用 C++中的static关键字用于声明全局共享变量,位于内存中一块单独的全局变量区域内。static声明的变量会一直存在,C++的static在如果在代码块内,则声明的变量只能在代码块内使用,如果static声明不在任何函数内,则可以在此文件中使用。 一、static在面向过程中的应用 1、静态全局变量 内存分配在全局数据区(.bss未初始化.data初始化)、 未初始化的静态全局变量会初始化为0且只会初始化一次、 静态全局变量只能在文件内访问不能在文件外访问。 在其他文件中

qq_34796146的博客 679

C/C++中static的关键字的理解总结(对比在C和C++中的区别和相同)

前言 static关键字非常好用,特别是早期时候,对于C语言来说,就是靠static关键字完成封装性滴;常见的大型项目中,static用得非常多,并且static关键字也是面试时候的热门关键字之一。在C++中static关键字由于多了类,所以会在C语言的基础上扩展了一些关于类中成员用static关键字修饰的所以掌握非常重要。 一. C语言中的static关键字 0) static关键字的名字理解 static关键字,有人说他命名得不好?因为static翻译为中文是有安静的意思。但是,对于static关键字

呋喃吖的博客 3110

C/C++中的static关键字的总结

static的历史 术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。 随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。 最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是

OSKernelLAB(gatieme) 2009
上一篇: 堆排序(排升序为啥建大堆,排降序为啥建小堆)
下一篇: 重载、重写、隐藏是什么?
coolnut12138
博客等级 码龄9年 51粉丝 75原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值