Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >static静态变量在内存中的存储[通俗易懂]

static静态变量在内存中的存储[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-08-18 11:45:33
发布于 2022-08-18 11:45:33
2.2K0
举报

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

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

static的内部机制: 静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被 调用,所以静态数据成员不能在任何函数内分配空间和初始化。这样,它的空间 分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是 类定义的内部实现,那里有类的成员函数定义;三是应用程序的main()函数 前的全局数据声明和定义处。 静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据 成员)。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所 以在类声 明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因 为那会造成在多个使用该类的源文件中,对其重复定义。 static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空 间,静态 数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌 套的成员已经初始化了。消除时的顺序是初始化的反顺序。

static的优势: 可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态 数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样, 但它的 值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存 取更新后的相同的值,这样可以提高时间效率。引用静态数据成员时,采用如下 格式: <类名>::<静态成员名> 如果静态数据成员的访问权限允许的话(即public的成员),可在程序中, 按上述格式 来引用静态数据成员。

ps: (1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针, 这就导致了它仅能访问类的静态数据和静态成员函数。 (2)不能将静态成员函数定义为虚函数。 (3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少 有些特殊,变量地址是指向其数据类型的指针 ,函数地址类型是一个 “nonmember函数指针”。

(4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数

结果就产生了一个意想不到的好处:成为一个callback函数,使得我们得以将 c++和c-based x window系统结合,同时也成功的应用于线程函数身上。 (5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成 员的访问时间,节省了子类的内存空间。 (6)静态数据成员在<定义或说明>时前面加关键字static。 (7)静态数据成员是静态存储的,所以必须对它进行初始化。 (8)静态成员初始化与一般数据成员初始化不同: 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相 混淆; 初始化时不加该成员的访问权限控制符private,public等; 初始化时使用作用域运算符来标明它所属类; 所以我们得出静态数据成员初始化的格式: <数据类型><类名>::<静态数据成员名>=<值> (9)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以 屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但 我们有 重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用 了一种绝妙的手法:name-mangling 用以生成唯一的标志。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135338.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月3,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
探索C++中的类与对象:构建程序的基石(上)
在编程的世界里,C++以其强大的灵活性和高效性,在众多编程语言中占据了举足轻重的地位。它不仅继承了C语言的底层操作能力和高效执行速度,还引入了面向对象编程(OOP)的概念,极大地提升了代码的可维护性、可扩展性和重用性。其中,类和对象是C++面向对象编程的核心,它们为程序员提供了一种组织代码、模拟现实世界实体以及实现复杂数据结构的有效方式。
suye
2025/05/27
850
C++ Qt常用面试题整理(不定时更新)[通俗易懂]
1.static:静态变量声明,分为局部静态变量,全局静态变量,类静态成员变量。也可修饰类成员函数。
全栈程序员站长
2022/09/12
6.7K0
C++ Qt常用面试题整理(不定时更新)[通俗易懂]
C++必知必会之基础知识-常用关键字(1)
Hello,大家好!我是木荣。温故而知新,可以为师矣。作为一名攻城狮,扎实的基本功是解决问题及完成工作中任务的重要前提。没有良好的基本功作为铺垫,一味的追求知识的宽度是毫无意义,知其然更要知其所以然。因此,在平时和小伙伴们聊天时,在谈到学习技术方面的问题,我会告诉他们注重基本功。所以,最近文章会总结一些日常编程工作中常用的重要基本知识点,根据平时工作中常用的也是重要的知识点逐步展开。
Linux兵工厂
2023/09/15
2370
C++必知必会之基础知识-常用关键字(1)
类与对象下 与 内存管理
• 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。 • 每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。 • 引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始 化,否则会编译报错。 • C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的成员使⽤的。 • 尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。如果你没有给缺省值,对于没有显⽰在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显⽰在初始化列表初始化的⾃定义类型成员会调⽤这个成员类型的默认构造函数,如果没有默认构造会编译错误。 • 初始化列表中按照成员变量在类中声明顺序进⾏初始化,跟成员在初始化列表出现的的先后顺序⽆关。建议声明顺序和初始化列表顺序保持⼀致
2024/10/14
1130
C++从入门到精通——static成员
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。
鲜于言悠
2024/04/21
5790
C++从入门到精通——static成员
C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】
今天我整合了2021年100道大厂高频C++基础面试题,里面包含了C++很多基础知识点,干货满满。因内容较多,篇幅较长,所以会分成上下两篇讲解,强烈建议小伙伴们收藏!
Java架构师必看
2021/07/19
2.3K0
C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】
C/CPP中static的用法:全局变量与局部变量
 static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。
CtrlX
2022/11/18
2.9K0
C/CPP中static的用法:全局变量与局部变量
【C++】static关键字及其修饰的静态成员变量/函数详解
全局(静态)存储区:分为data段和bass段。data段(全局初始化区)存放初始化的全局变量和静态变量;bass段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中bass段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
修修修也
2024/04/01
3.3K0
【C++】static关键字及其修饰的静态成员变量/函数详解
C++那些事之static那些事
当与不同类型一起使用时,Static关键字具有不同的含义。我们可以使用static关键字:
公众号guangcity
2019/09/20
6040
C/C++中static变量和static函数的用法
C语言中定义一个静态变量和静态函数主要是为了满足某个文件的需求 比如我们在文件List.c中定义 static int count = 0; //静态变量 static int get_last_node(List *Head);//定义静态函数
全栈程序员站长
2022/09/13
2.5K0
C++避坑---关键字static的使用及注意事项
static关键字可用于声明变量、函数、类数据成员和类函数。其主要影响着它们的生命周期、作用域和存储位置。
艰默
2023/05/17
7980
C++避坑---关键字static的使用及注意事项
static的使用总结
全局变量前加上关键字static,全局变量就定义成一个全局静态变量.,全局静态变量存储在静态存储区,在整个程序运行期间一直存在。全局静态变量在程序运行之前就存在。
WindSun
2019/08/29
1.1K0
static用法详解
一. 面向过程程序设计 1、静态全局变量   在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Example 1   #include <iostream.h>   void fn();   static int n; //定义静态全局变量 void main()     { n=20;     cout<<n<<endl;     fn();     }   void fn()     { n++;     cout<<n<
猿人谷
2018/01/17
1.2K0
static用法详解
结构体和类
在C++中类与结构体并没有太大的区别,只是默认的成员访问权限不同,类默认权限为私有,而结构体为公有,所以在这将它们统一处理,在例子中采用类的方式。
Masimaro
2018/08/31
7530
《编程千问》第十三问:C++中静态变量的用法有哪些?
码事漫谈
2024/12/20
990
《编程千问》第十三问:C++中静态变量的用法有哪些?
C++:静态成员与友元
我们在开发中会发现,有一些属性是所有对象所共有的,比如:学生总人数,链表头指针,尾指针等,这些数据成员没有必要和对象进行关联,它们更需要被所有对象所共享,而不是在每个对象中都对其重复进行操作。如果将其放在全局变量中,那么 C++ 的封装性将受到影响,静态成员案例见以下程序片段
字节星球Henry
2021/08/09
7430
C++ 知识点总结篇
const 在不同位置时的不同意义 指针类型前:声明一个指向常量的指针,程序中不能通过指针来改变它所指向的值,但指针本身的值可以改变,即指针可以指向其他数据; "*"号和指针名之间,声明一个指针常量(常指针),指针本身的值不可改变,即不能指向其他数据,但指向的数据的值可以改变; 两个地方都加,声明指向常量的指针常量,指针本身的值不可改变,指向的数据也不能通过指针改变; 函数指针 使用函数指针之前,必须先赋值,使它指向一个函数入口地址,赋值语法格式为:函数指针名 = 函数名,其中函数名代表的函数必须是一个已经
村雨遥
2022/06/15
5280
C++ 知识点总结篇
c语言中static关键字用法详解
static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。
全栈程序员站长
2022/08/12
7930
C++知识概要
综上: 栈区(stack) — 由编译器自动分配释放,存放函数的参数值,局部变量的值等其操作方式类似于数据结构中的栈 堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS(操作系统)回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表 全局区(静态区)(static) — 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放 文字常量区 — 常量字符串就是放在这里的。程序结束后由系统释放 程序代码区 — 存放函数体的二进制代码
范中豪
2021/05/27
1.2K0
C++类中静态变量和静态方法使用介绍
刷剑指offer第64题涉及到类内静态成员与方法的知识,有点模糊,找了两篇博客整理一下。
全栈程序员站长
2022/09/01
2.9K0
相关推荐
探索C++中的类与对象:构建程序的基石(上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档