static 末蓝、 2022-03-16 02:38 127阅读 0赞 **static** C++的static有两种用法,面向过程程序设计中的static和面向对象程序设计中的static 前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 1 面向过程static: **1.1 静态变量** **1.1.1 静态全局变量** 静态全局变量有以下特点: **1、 该变量在全局数据区分配内存; 2、 未经初始化的静态全局变量会被程序自动初始化为0; 3、 静态全局变量在声明它的整个文件是可见的,而在文件之外是不可见的; 4、 静态变量都在全局数据区分配内存,包括后面要提到的静态局部变量。** 代码区 全局数据区 堆区 栈区 全局数据区的数据并不会因为函数的退出而释放空间。 定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处: 1、 **静态全局变量不能被其他文件所有**; 2、 **其他文件中可以定义相同名字的变量,不会发生冲突**; 全局变量和静态全局变量区别: **1、 全局变量是不是显式用static修饰的全局变量,全局变量的作用于是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern全局变量的声明,就可使用全局变量。** 2、 静态全局变量是显式用static修饰的全局变量,作用于是声明此变量所在的文件,其他文件即使使用extern使用也不能使用。 **1.1.2 静态局部变量** 在函数体内定义一个变量,当程序执行到该语句是都会给该局部变量分配栈内存,随着程序退出函数体,系统就会回收栈内存,局部变量就相应失效。 但有时候我们需要两次调用之间对变量的值进行保存,静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保存到下一次调用,直到下次赋新值。 静态局部变量有以下特点: 1、 该变量在**全局数据区分配内存**; 2、 静态局部变量在程序执行到该对象的声明处是**被首次初始化,即以后的函数调用不会再进行初始化**; 3、 静态局部变量一般在声明处初始化,如果没有被显示初始化,会被程序自动初始化为0; 4、 **它始终驻留在全局数据区,直到程序运行结束**。**但其作用域为局部作用域**,当定义它的函数或语句块结束时,其作用域随着结束。 1.2 静态函数(与静态全局变量类似) 在函数的返回值类型前面加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其他文件使用。 **2 面向对象static 2.1静态数据成员** 在类中数据成员的声明前面加上关键字static,该数据成员就是类内的静态数据成员。 静态数据成员有以下特点: 1、对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员(不属于任何对象)。无论这个类定义了多少个对象,静态数据成员在程序中只有一份拷贝,该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个成员都是一样的,它的值可以更新。 2、静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。 3、静态数据成员和普通数据成员一样遵从public,protected,private访问规则。 4、因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它。 静态数据成员初始化的格式: <数据类型><类名>::<静态数据成员名>=<值> int Myclass::Sum = 0;属于这个类的静态成员变量 类的静态数据成员有两种访问形式: <类对象名>.<静态数据成员名> 或 <类类型名>.<静态数据成员名> 同全局变量相比,静态数据成员有两个优势: 1、 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。 2、 可以实现信息隐藏。**静态数据成员可以是private成员,而全局变量不能**。 **2.2 静态成员函数** 静态成员函数为类的全部服务而不是为某一个类的具体对象服务。 普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身。 静态成员函数由于不是与任何的对象相联系,因此它不具备this指针。从这个意义上讲,它无法访问非静态的数据成员,也无法访问非静态成员函数,只能访问调用其余的静态成员函数。 关于静态成员函数,可以总结为以下几点: 1、 出现在类体外的函数不能指定关键字static; 2、 **静态成员**之间可以相互访问,静态成员函数访问静态数据成员和访问静态成员函数 3、 非静态成员函数可以任意地访问静态成员函数和静态数据成员。 4、 \*\*静态成员函数不能访问非静态数据成员(因为不具备this指针)\*\*和非静态成员函数。由于没有了this指针的额外开销,静态成员函数与类的全局函数相比速度上会有少许的增加。 调用静态成员函数,可以用成员访问操作符(.)和(->) 也可以直接使用如下格式: <类名>::<静态成员函数名>(<参数表>) N.GetSum(); Myclass::GetSum(); **作用:** static是C++中常用的修饰符,它被用来控制变量的存储方式和可见性。 **为什么要引入static** 在函数内部定义的变量,随着程序执行到它的定义时开始而创建内存,随着函数的结束而消失,但是我们想将这个变量在下次调用时,如何实现,通常最简单的办法是定义一个全局变量,但是全局变量有很多缺点,**最明显的缺点就是破坏了此变量的访问范围**。将变量定义为static就能解决这个问题。只对声明该变量的文件可见 **什么时候用static** 需要一个变量或函数**为整个类服务**而不是为某个对象服务,同时又要求**不破坏类的封装**性,即要此成员因此在类的内部,不对外可见。 **内部机制** 静态数据成员在程序一开始就必须存在,因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。静态数据成员要实际地分配空间,故不能在类的声明中定义(只能在类中声明数据成员)。 优势: 可以节约内存,因为它对所有对象是共用的。
相关 Static > \很多成员变量只写一个,但每个对象都可以使用,说明成员变量或者方法存在属性,属于对象/类本身 > \ java成员变量中是通过是否有static修饰区分类/对象 > 骑猪看日落/ 2023年10月07日 18:22/ 0 赞/ 19 阅读
相关 static 参考:[https://blog.csdn.net/zdb292034/article/details/80720051][https_blog.csdn.net_zdb292 清疚/ 2023年01月23日 06:57/ 0 赞/ 15 阅读
相关 static static简介 static是一个修饰符,可以修饰属性、方法、内部类、初始化块, 称为静态成员或类成员,不能修饰局部变量和构造器 什么时候需要使用静态的成员 怼烎@/ 2022年12月27日 02:14/ 0 赞/ 18 阅读
相关 static 1 C++中 简介 C\与C++的static有两种用法: [面向过程][Link 1] [程序设计][Link 2]中的static和 [面向对象程序设计][L 今天药忘吃喽~/ 2022年09月18日 04:50/ 0 赞/ 172 阅读
相关 static 类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。 静态类成员包括静态数据成员和静态函数成员两部分 朱雀/ 2022年08月09日 05:10/ 0 赞/ 104 阅读
相关 final static和static ![Image 1][] ![Image 1][]![Center][] ![Image 1][] ![Center 1][] ![Cent 你的名字/ 2022年06月03日 10:55/ 0 赞/ 240 阅读
相关 static package com.atguigu.java1; / static,静态的,可以用来属性、方法、代码块(或初始化块)、内部类 客官°小女子只卖身不卖艺/ 2022年03月24日 19:10/ 0 赞/ 115 阅读
相关 static 文章目录 c中的static、C++中static拓展 static修饰类中成员变量 static修饰类中成员函数 系统管理员/ 2022年03月19日 15:37/ 0 赞/ 122 阅读
相关 static static C++的static有两种用法,面向过程程序设计中的static和面向对象程序设计中的static 前者应用于普通变量和函数,不涉及类;后者主要说明stat 末蓝、/ 2022年03月16日 02:38/ 0 赞/ 128 阅读
相关 static static静态 static应用范围:可用于内部类、方法和变量。 是一个修饰符,用来修饰变量、方法没有被static修饰的对象称为实例变量 静态变量,则 浅浅的花香味﹌/ 2021年09月10日 23:10/ 0 赞/ 262 阅读
还没有评论,来说两句吧...