您的位置:首页 > 其它

关键字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,有待补充.......)

参考多处资料,如有侵权,敬请告知,立马删除。谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: