C/C++ Static总结
来源:互联网 发布:linux下如何卸载jdk1.8 编辑:程序博客网 时间:2024/06/03 22:03
static的作用主要有以下3个:
1、扩展生存期;
2、限制作用域;
3、唯一性;
1、扩展生存期
这一点主要是针对普通局部变量和static局部变量来说的。声明为static的局部变量的生存期不再是当前作用域,而是整个程序的生存期。
在程序中,常用内存类型主要有堆、栈和静态存储区。要理解static局部变量就必须首先理解这三种内存类型。见【http://blog.csdn.net/xiyanlgu/article/details/8649643#】
在C/C++中, 局部变量按照存储形式可分为三种auto, static, register(谭浩强, 第174-175页)
局部变量的默认类型都是auto,从栈中分配内存。auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放。
而static变量,不管是局部还是全局,都存放在静态存储区。表面意思就是不auto,变量在程序初始化时被分配,直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期. 如果在main前设置断点,然后查看static变量,已经被初始化,也就是说static在执行main函数前已经被初始化。也就是在程序初始化时被分配。
2、限制作用域
这一点相对于普通全局变量和static全局变量来说的。对于全局变量而言,不论是普通全局 变量还是static全局变量,其存储区都是静态存储区,因此在内存分配上没有什么区别。
区 别在于:
1) 普通的全局变量和函数,其作用域为整个程序或项目,外部文件(其它cpp文件)可以通过extern关键字访问该变量和函数。一般不提倡这种用法,如果要在多个cpp文件间共享数据,应该将数据声明为extern类型。
在头文件里声明为extern:
extern int g_value; // 注意,不要初始化值!
然后在其中任何一个包含该头文件的cpp中初始化(一次)就好:
int g_value = 0; // 初始化一样不要extern修饰,因为extern也是声明性关键字;
然后所有包含该头文件的cpp文件都可以用g_value这个名字访问相同的一个变量;
2) static全局变量和函数,其作用域为当前cpp文件,其它的cpp文件不能访问该变量和函数。如果有两个cpp文件声明了同名的全局静态变量,那么他们实际上是独立的两个变量。
static函数的好处是不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
头文件中的static变量
如果在一个头文件中声明:
staticint g_vaule = 0;
那么会为每个包含该头文件的cpp都创建一个全局变量,但他们都是独立的;所以也不建议这样的写法,一样不明确需要怎样使用这个变量,因为只是创建了一组同名而不同作用域的变量。
3、数据唯一性
这是C++对static关键字的重用。主要指静态数据成员/成员函数。
static数据成员的初始化:
(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。
(2) 初始化时不加该成员的访问权限控制符private,public等。
(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
(4) 静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
Static成员函数
静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态的成员函数,这是由于静态的成员函数没有this指针。
#include <stdio.h>int fun(void){ staticint count = 10; // 事实上此赋值语句从来没有执行过 return count--;}int count = 1;int main(void){ printf("global\t\tlocal static\n"); for(; count <= 10; ++count) printf("%d\t\t%d\n", count, fun()); return 0;}
C 和C++ 中static的区别
C++ :
static 局部变量
1)内存中的位置:静态存储区
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
C:
static局部变量作用于整个程序的运行阶段,知道程序运行结束,销毁static局部变量。
- static 作用总结(c/c++)
- c++/c static 用法总结
- C语言static总结
- C语言static总结
- C/C++ Static总结
- C/C++ static总结
- 《c++》static总结
- 关于c/c++ static 总结
- C#static关键字用法总结
- C中static学习总结
- c/c++ static 用法总结
- C#static关键字用法总结
- C语言中的static总结
- C语言 static 用法总结
- C/C++ static 用法总结
- C/C++ static 用法总结
- 【C++】static关键字用法总结
- c/c++ static关键字总结
- 15 InputStreamReader 桥连接
- MySQL5.1版本的主从复制搭建
- C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考
- unzip *.zip 遇到‘checkdir error:cannot create database’
- MS SQL Server 数据库连接字符串详解
- C/C++ Static总结
- 分组交换数据报方式和虚电路方式的异同点
- 解决SecureCRT中文显示乱码
- How to program in C++ (The most important and basic materials)
- 从算法到程序
- CACHE & TLB (一)
- 工作问题 解决关于hibernate 更新数据的问题
- 10 DataOutputStream
- 开发者账号注册的详细流程