关键字static
2015-08-26 15:48
211 查看
关键字static看起来很安静......
1 修饰变量
变量又分为全局变量和局部变量,但是被static修饰的变量都将存到内存的静态区。
静态全局变量:作用域仅限于变量被定义的文件中,且从定义之处开始,到文件尾结束。(定义之前的代码想用可以用extern声明,貌似没人这么变态的用吧?不过其他文件使用extern声明也没办法使用)
静态局部变量:函数体中定义的,就只能在函数体内使用,别的函数就算在同一个文件也不能使用。由于被static修饰的变量都存放在内存的静态区,所以即便函数运行结束,该静态变量的值依然安静的存在,直到该程序结束。
作用域也就搞明白了吧?可是就是偏偏爱乱用!要出事了呢罒ω罒
注:
i 在函数体内定义的静态局部变量,在第二次调用时,不会再次定义,而是直接使用存放在静态区的值。eg:
void fun()
{
static int i = 0; //关于静态变量是否要初始化的问题还是表纠结了,何苦呢
++i;
}
int main()
{
for(int k = 0; k<10; ++k)
{
fun();//最后一次循环后i=10,也就是说static变量是有记忆功能的呢
}
}
扩展知识:单例模式
ii(a)最好不要在头文件中定义静态全局变量,很容易会出现重复定义的错误,即便使用条件预编译也是不能避免。
(b)如果在头文件中定义或声明了静态全局变量,不同文件包含后,内存的静态区将会为每个文件分配一个地方存放该变量,即便名字相同,但是两者已经是互不干扰的状态了,用起来一定很烦恼。
2 修饰函数
这里static的含义就不是存储方式了,而是指对函数的作用域仅仅局限于本文件(所以又称内部函数)。
也就是说静态函数只能在其定义的.cpp或.c中调用,非常任性!
那么肿么办呢?
表担心,对静态函数用一般函数进行封装。每一个静态接口函数对应一个封装的一般形式的函数,调用时,调用这些封装函数即可。
3 static的风流史(摘)
术语static有着不寻常的历史。起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。
(关于C++中的static,有待补充.......)
参考多处资料,如有侵权,敬请告知,立马删除。谢谢
1 修饰变量
变量又分为全局变量和局部变量,但是被static修饰的变量都将存到内存的静态区。
静态全局变量:作用域仅限于变量被定义的文件中,且从定义之处开始,到文件尾结束。(定义之前的代码想用可以用extern声明,貌似没人这么变态的用吧?不过其他文件使用extern声明也没办法使用)
静态局部变量:函数体中定义的,就只能在函数体内使用,别的函数就算在同一个文件也不能使用。由于被static修饰的变量都存放在内存的静态区,所以即便函数运行结束,该静态变量的值依然安静的存在,直到该程序结束。
作用域也就搞明白了吧?可是就是偏偏爱乱用!要出事了呢罒ω罒
注:
i 在函数体内定义的静态局部变量,在第二次调用时,不会再次定义,而是直接使用存放在静态区的值。eg:
void fun()
{
static int i = 0; //关于静态变量是否要初始化的问题还是表纠结了,何苦呢
++i;
}
int main()
{
for(int k = 0; k<10; ++k)
{
fun();//最后一次循环后i=10,也就是说static变量是有记忆功能的呢
}
}
扩展知识:单例模式
ii(a)最好不要在头文件中定义静态全局变量,很容易会出现重复定义的错误,即便使用条件预编译也是不能避免。
(b)如果在头文件中定义或声明了静态全局变量,不同文件包含后,内存的静态区将会为每个文件分配一个地方存放该变量,即便名字相同,但是两者已经是互不干扰的状态了,用起来一定很烦恼。
2 修饰函数
这里static的含义就不是存储方式了,而是指对函数的作用域仅仅局限于本文件(所以又称内部函数)。
也就是说静态函数只能在其定义的.cpp或.c中调用,非常任性!
那么肿么办呢?
表担心,对静态函数用一般函数进行封装。每一个静态接口函数对应一个封装的一般形式的函数,调用时,调用这些封装函数即可。
3 static的风流史(摘)
术语static有着不寻常的历史。起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。
(关于C++中的static,有待补充.......)
参考多处资料,如有侵权,敬请告知,立马删除。谢谢
相关文章推荐
- 别让Android Studio的缓存文件占据你的C盘
- linux网络编程_1
- 二分+树状数组/线段树(区间更新) HDOJ 4339 Query
- 第18章 发布与订阅
- 补充 jsp 页面的日期显示的格式问题
- 爬虫简单示例,用httpClient4.2.1实现(转载)
- U-Boot常用命令手册
- BLToolkit : Reflection.Emit的使用场景、工具包及示例总结
- SQL——指定表名和列名,删除对应的列
- hdoj 2094 产生冠军
- wsimport命令构建WebService客户端
- 计算机如何表示小数
- POJ -2635-The Embarrassed Cryptographer-数论
- matchTemplate函数
- 创建Tab页并且在存在的情况下刷新页面
- 通过句柄恢复Linux下误删除的数据库数据文件
- PCI Express的几个基本概念
- Spring定时任务的几种用法
- Service
- 64位系统 安装oracle