C++中static关键字

掌握C++中static关键字的用法 C++中的static关键字是一个非常强大的工具,它在多个方面对变量和函数的作用域、生命周期和链接属性进行控制。本章将简要介绍static关键字的概念和用途,为后续章节中更深层次的探讨奠定基础。全局变量是在函数外部定义的变量,它在整个程序的任何部分都可以被访问到。与局部变量不同,全局变量的生命周期贯穿整个程序执行过程,除非被显式地销毁或者程序结束。在全局变量前加上static关键字,就会限定该变量的作用域仅在定义它的文件内。也就是说,即使其他文件包含相同的头文件,他们也无法访问该变量。 阅读详情

1.static

控制变量的存储方式和可见性。

2.为什么要引入static?

函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,但函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题:如果将函数中此变量的值保存至下一次调用时,如何实现?最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有很多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。

3.什么时候用static?

需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。

4.static的内部机制:

静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。

这样,它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的main()函数前的全局数据声明和定义处。

静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以在类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。

static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。

5.static的优势

可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高实践效率。

6.引用静态数据成员

声明:加上static关键字

引用格式:<类名>::<静态成员名>

7.注意事项

①类的静态成员函数是属于某个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。

②静态数据成员是静态存储的,所以必须对它进行初始化。

③初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;不用加访问权限控制符private、public等;例:<数据类型><类名>::<静态数据成员名>=<值>

④静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。

例1:

class Point
{
public:
	void output()
	{
		cout<<"output()"<<endl;
	};
	static void init()
	{
		cout<<"init()"<<endl;
	};
};//勿忘记类定义最后的“;”。

void main()
{
	Point pt;
	pt.init();
	pt.output();
}
编译正确。
例2:

void main()
{
	Point::output();
}
类定义相同,main()改为上述,则编译错误。提示:非静态成员引用必须与特定对象相对。未实例化一个类的具体对象时,类是没有被分配内存空间的。
改为如下,编译通过。

void main()
{
	Point::init();
}
因为在类的定义时,它静态数据和成员函数就有了它的内存区,它不属于类的任何一个具体对象。
例3:

class Point
{
public:
	void output()
	{
		cout<<"output()"<<endl;
	};
	static void init()
	{
		x = 0;
		y = 0;
		cout<<"init()"<<endl;
	};
private:
	int x;
	int y;
};//勿忘记类定义最后的“;”。

void main()
{
	Point::init();
}
error:提示对非静态成员的非法引用。即:在一个静态成员函数里错误的引用了数据成员,还是那个问题,静态成员(函数)不属于任何一个具体的对象,那么在类的具体对象声明之前就已经有了内存区,而现在非静态数据成员还没有分配内存空间,那么这里调用就错误了,就好像没有声明一个变量却提前使用他一样。

例4:

class Point
{
public:
	void output()
	{
		cout<<"output()"<<endl;
	};
	static void init()
	{
		x = 0;
		y = 0;
		cout<<"init()"<<endl;
	};
private:
	static int x;
	static int y;
};//勿忘记类定义最后的“;”。

void main()
{
	Point::init();
}
结果如下:

因为静态的成员变量要进行初始化。

例5:

class Point
{
public:
	void output()
	{
		cout<<"output()"<<endl;
	};
	static void init()
	{
		x = 0;
		y = 0;
		cout<<"init()"<<endl;
	};
private:
	static int x;
	static int y;
};//勿忘记类定义最后的“;”。

int Point::x = 0;
int Point::y = 0;

void main()
{
	Point::init();
}
成功生成。在main()方法上面为静态成员初始化。


参考:

http://blog.youkuaiyun.com/cn_cainiao/article/details/5943070


DRAM 埋入式字线(Buried Wordline)技术深度解析:从二维平面到三维凹槽 埋入式字线(bWL)及其核心的埋入式沟道阵列晶体管(BCAT)架构,无疑是 DRAM 发展史上的一次关键性革命。它在约 40nm 技术节点被行业主流采纳,成功地帮助 DRAM 产业克服了传统平面晶体管的物理缩放极限。力挽狂澜的续命技术:bWL 通过引入三维沟道结构,从根本上解决了由短沟道效应和漏电流失控引发的数据保持危机,为经典的 1T1C(单晶体管 - 单电容)DRAM 单元架构延续了超过十年的生命力。协同优化的基石技术。 阅读详情

相关推荐

PPO算法详解:基于CartPole-v1的强化学习实现

PPO算法详解:基于CartPole-v1的强化学习实现

m0_54720701的博客 865

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 1894

夏令营纪实——东南大学计科院&PALM实验室面试全解析

本文详细解析了东南大学计科院与PALM实验室夏令营的面试全流程,包括前期准备、技术考察、项目经验深挖等关键环节。特别针对自然语言处理(NLP)和机器学习(ML)领域的高频问题提供应对策略,帮助申请者提升面试表现。文章还分享了实用的准备技巧和面试经验,为有意向参加该夏令营的学生提供宝贵参考。

convnet3designer的博客 459

C++ static关键字作用

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

ll148305879的博客 1万+

中移物联ML307C模组OPENCPU笔记2

本文介绍了如何编译和运行一个DEMO程序,以官方SDK为例。

weixin_43700831的博客 1887

VFH避障/局部路径规划算法

VFH避障/局部路径规划算法 本文章是我看《The Vector Field Histogram-Fast Obstacle Avoidance for Mobile Robots》论文时候的笔记,感兴趣的欢迎去看原论文。 VFH中有一些概念是从其他算法中借鉴过来的,并且VFH算法本身就是对VFF(Virtural Force Field)的一种改进,其中有很多的相似之处。所以按照原论文的思路,先介绍由CMU提出的Certainty Grid算法中的一些概念,再介绍一下势场法中的一些概念,接着介绍一下VFF

qq_41845878的博客 8118

C++之static关键字

有int a = 5;/*=======这是重点======*/#endifint main()print();程序说明:在test.h定义了一个int的变量a,我们想在main.cpp中输出这个a,使用gcc进行编译。可以看到是链接期间的错误,多重定义。我们分析下为什么会出现这个错误。首先明白程序编译的过程。将源代码编译为可执行文件有四个阶段:预处理——>编译——>汇编——>链接。define定义的替换,includemain.cpp中include了test.h,编译器会将。

qq_41596730的博客 1593

ros_control硬件接口实战:从零构建机器人控制框架

本文详细介绍了ros_control硬件接口在机器人控制框架中的核心作用与实践方法。通过解析硬件接口类型、实现标准接口、构建主控制循环及自定义功能扩展,帮助开发者从零构建高效的机器人控制系统,提升硬件与ROS的协同效率。

lstm7chronicler的博客 500

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

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

weixin_39528697的博客 120

大语言模型的三种主要架构 Decoder-Only、Encoder-Only、Encoder-Decoder

f基于 Transformer 模型以非灰色显示:decoder-only 模型在蓝色分支,encoder-only 模型在粉色分支,encoder-decoder 模型在绿色分支。模型在时间线上的垂直位置表示它们的发布日期。开源模型由实心方块表示,而闭源模型由空心方块表示。右下角的堆积条形图显示了各公司和机构的模型数量。从时间轴上,我们可以看到:2021年前,当 OpenAI 决定在,他们实际上是在逆流而上。

u010899985的博客 2万+

腾讯云运维工程师认证TCA--真题(最新2022.11)

解析:云原生应用的12要素,1.基准代码:一份基准代码,多份部署;解析:腾讯云主账号具备对其名下资源(包括存储桶)的最大权限,您虽然可以在存储桶策略中限制几乎所有操作,但主账号始终具备 PUT Bucket Policy 操作的权限,主账号调用该操作不检查存储桶策略。解析:瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。解答:云原生五大关键技术:微服务、容器化、DevOps、持续交付。

e1210101的博客 9915

C++static关键字

面向过程(C 语言)①函数内 static 局部变量:生命周期全局,仅初始化一次,函数内私有②static 全局变量 /static 普通函数:作用域锁定当前文件,外部不可访问C++ 类中静态成员①静态成员变量:全类共享,存全局区,类外初始化,无对象也能访问②静态成员函数:无 this 指针,只能操作静态成员,通过类名直接调用3.单例模式①依靠「私有构造+静态对象指针+静态获取函数」, 限制全局仅存在一个实例。

2501_94041724的博客 1841

DICOM医学影像开发者必备工具清单

PyDicom 是一个纯 Python 实现的 DICOM 文件解析库,允许开发者读取、修改和写入 DICOM 文件。它无需依赖外部库,易于集成到现有的 Python 项目中,非常适合快速开发和原型设计。DCMTK(DICOM Toolkit)是一个由OFFIS开发的开源C++库,提供了一整套DICOM标准的实现,包括文件操作、网络通信和图像处理等功能。它是开发高性能DICOM应用的理想选择。MicroDICOM 是一款免费的DICOM查看器,适用于Windows平台。

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 577

C++ static关键字

C++ static关键字 static关键字可用于声明全局范围、命名空间范围和类范围的变量和函数。 静态变量还可在本地范围声明。 先介绍几个概念: 静态持续时间,在程序启动时分配对象或变量,并在程序结束时释放对象或变量。 外部链接,变量的名称在用于声明变量的文件的外部是可见的。 内部链接,名称在用于声明变量的文件的外部是不可见的。 默认情况下,在全局命名空间中定义的对象或变量具有静态持续时间和外部链接。 **static**关键字常用于以下情况: 在全局和/或命名空间范围 (在单个文件范

weixin_44966641的博客 2652

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++中static关键字的作用

C++中的static关键字的作用总结 C++中的static的两种用法:一种是面向过程程序设计,第二种是面向对象程序设计。前者应用于普通变量和函数,不涉及类;后者涉及static在类中的作用。 1.面向过程设计中的static 1.1 静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Example 1 #incl...

一个勤奋的coder的博客 4029

Devexpress16.2.6破解工具

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

C\C++static关键字的用法总结

static关键字的作用主要起隐藏作用 static关键字在C\C++中都可以修饰内置类型变量、函数 static修饰内置类型变量为静态变量: static修饰的内置类型变量分为静态全局变量和静态局部变量,静态变量内存分配在 .data段,生成的符号为local类型的符号,在链接阶段进行符号解析时不做处理。静态变量只初始化一次,未初始化的静态变量会默认初始化为0。静态全局变量只在本文件可见,...

magic_world_wow的博客 1万+

【C++ 】详解Static关键字

Static关键字用于声明变量或函数的存储期为整个程序的执行期间,即使它们的作用域是局部的。在C++中,static还可以用来定义类的静态成员。静态关键字在C++中提供了强大的工具,用于控制对象的可见性、生命周期和初始化。通过正确使用它们,可以写出更健壮、更易于维护的代码。然而,也需要注意静态成员可能引入的全局状态,这可能会影响程序的可测试性和线程安全性。

Z1tai的博客 1911

C++的static关键字

c++的static关键字

Serven的博客 1万+

Cpp关键字破解(二)【static】篇

关键字总结-static 文章目录关键字总结-static概念static使用场景静态成员的使用类外初始化静态成员 概念 在一个类中,有时候并不希望所有的成员都能与类的对象相关联,而只希望有些成员能够被类的所有对象共享,此时就需要用到static关键字。静态成员可以是public也可以是private,静态成员包括:静态数据成员、静态成员函数。 定义一个类表示银行账户,其中每个类对象都拥有相同的静态成员:利率。一旦更新静态成员后,该类的所有对象都会使用新的静态成员,这是因为静态成员与类直接绑定。 class

日月既往,不可复追 465

C++中的static关键字

(5)在C++中,static关键字可以用于定义类中的静态成员函数:与静态成员变量类似,类里面同样可以定义静态成员函数。1、修饰静态局部变量,会改变局部变量的存储位置,从而使得局部变量的生命周期变长,延长至程序结束才销毁,普通的局部变量创建后是放在栈区,这种局部变量进入作用域时创建,出了作用域就销毁。在C语言中static用来修饰局部静态变量和外部静态变量和函数,而C++语言还可以用来定义类的成员变量和函数,即静态成员和静态成员函数,C++的静态成员可以在多个对象实例之间进行通信,传递信息。

weixin_65589140的博客 476

C++ static 关键字面试深度解析

摘要:C++ static 关键字面试深度解析 static 关键字在 C++ 中控制变量/函数的生命周期和可见性,有三大应用场景: 函数内静态局部变量:延长生命周期至程序结束,用于计数器或单例模式 全局静态变量/函数:限制为内部链接,仅在当前文件可见(现代C++建议用匿名命名空间替代) 类静态成员:属于类而非对象,所有实例共享。静态函数无this指针,不能访问非静态成员 关键区别:普通全局变量具有外部链接,而静态全局变量只有内部链接。匿名命名空间比static更优,因其能封装类型(class/struct

jokr_的博客 842

【C++八股】static关键字

用于修改变量、函数、类成员的存储方式和作用域。面试中常考 的作用、使用场景、与普通变量的区别。作用:局部变量的生命周期变为整个程序运行期间,但作用域仍然在当前函数内。 ✅ 特点:✅ 应用场景:计数器、状态保持等。✅ 作用:限制全局变量的作用域,使其只能在当前文件内访问。1)普通全局变量(作用域跨文件) (2) 修饰全局变量(作用域仅限当前文件) ✅ 总结:✅ 应用场景:防止变量污染,避免多个文件中的变量重名。(1)普通函数(可跨文件调用) (2) 修饰函数(作用域仅限当前文件) ✅ 总

2301_79867980的博客 795

C++ 中 Static 关键字的作用

C++ 中 Static 关键字的作用Static 用在类或者结构体的外部Static 用在类或者结构体的内部Static 作用于局部(Local) Static 能够被用在一个类或者结构体的内部或者外部。 如果用在外部的话,意味着被你声明成 static 的变量只能作用于该定义的 Translation Unit. 如果用在内部的话,则意味着该 static 变量将会共享该类所有实例的内存空间。...

weixin_44387066的博客 772

C++ static关键字详解

本文内容会结合三个部分,分别通过代码说明static的特点,以及它们的使用场景,最后拿出几个问题进行讨论。

qq_43262059的博客 1842

[C++——lesson11.static关键字]

本文系统介绍了C/C++中static关键字的多种用法。在C语言中,static可修饰局部变量(改变存储位置和生命周期)、全局变量(限制作用域)和函数(隐藏实现)。C++中static还可修饰类成员,包括静态成员变量(类共享)和静态成员函数(无this指针)。文章通过代码示例详细解析了static的特性,如初始化规则、访问方式等,并提供了面试题案例展示实际应用。最后总结了static在不同场景下的核心作用:控制存储周期和作用域,强调合理使用可提升代码封装性和安全性。全文从基础概念到高级用法循序渐进,帮助读者

2401_83386596的博客 998
上一篇: C++中构造函数、析构函数和虚函数
下一篇: C++拷贝构造函数
hellorichen
博客等级 码龄13年 199粉丝 104原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值