c与c++ 中都有static 关键字,主要用于修饰局部变量、全局变量、函数;c++ 中还有类数据成员与成员函数。static 的主要作用包括:
1. 扩展生命周期
2. 限制作用域
3. 唯一性
static修饰局部变量
/*
来自:http://blog.csdn.net/shanghairuoxiao/article/details/72904292
static 修饰局部变量
static修饰局部变量时,使得被修饰的变量变成静态变量,存储在静态区。存储在静态区的数据
生命周期与程序的生命周期相同,即在main函数之前初始化,在程序退出时销毁。(无论是局部
静态还是全局静态)
局部静态变量使得该变量在退出函数后不会被销毁,因此在此调用该函数时,该变量的值与上次
退出函数时值相同。声明周期并不代表其可以一直被访问,因为变量的访问还受作用域的限制。
*/
#include <iostream>
using namespace std;
void fun()
{
/* 实际上sCnt的初始化不是在函数体第一次执行时完成的,而是在编译期其值
就已经确定,在main函数之前就已经完成初始化,所以静态变量只会初始化一次
*/
static int sCnt=0;
cout<<"call fun :"<<++sCnt<<" times"<<endl;
}
static int sIint = 3;
int main(int argc, char const *argv[])
{
cout<<"sIint: "<<sIint<<endl;//在main函数之前就已经初始化且只初始化一次
for (int i = 0; i < 10; ++i)
{
fun();
}
// cout<<sCnt<<endl; //error: 'sCnt' was not declared in this scope 注意变量的作用域
return 0;
}
/*
输出:
sIint: 3
call fun :1 times
call fun :2 times
call fun :3 times
call fun :4 times
call fun :5 times
call fun :6 times
call fun :7 times
call fun :8 times
call fun :9 times
call fun :10 times
*/
static修饰全局变量
//头文件a.h
#ifndef _A_H
#define _A_H
static int a = 1;
void fun1();
#endif
//实现文件a.cpp,包含头文件a.h
#include "a.h"
#include <iostream>
using namespace std;
void fun1()
{
cout<<__FILE__<<" "<<__LINE__<<" "<<__FUNCTION__<<" a:"<<a<<" &a:"<<&a<<endl;
}
#ifndef _B_H
#define _B_H
#include "a.h"
void fun2();
#endif
//实现文件b.cpp,包含头文件a.h
#include "b.h"
#include "a.h"
#include <iostream>
using namespace std;
void fun2()
{
a++;
cout<<__FILE__<<" "<<__LINE__<<" "<<__FUNCTION__<<" a:"<<a<<" &a:"<<&a<<endl;
}
/*
全局变量本来就存储在静态区,因此static并没有改变其存储位置。但是static
限制了其链接属性。被static修饰的全局变量只能被包含该定义的文件访问。
*/
#include "a.h"
#include "b.h"
#include <iostream>
using namespace std;
int main()
{
fun1();
fun2();
fun1();
return 0;
}
/*
输出:
a.cpp 9 fun1 a:1 &a:0x601278
b.cpp 10 fun2 a:2 &a:0x60127c
a.cpp 9 fun1 a:1 &a:0x601278
从输出的结果可以发现,在文件b中修改了全局变量a,并没有使文件a中的变量a发生变化,
从对不同文件中变量a的存储地址来看,静态全局变量a在文件a.cpp与b.cpp中分别进行了
定义。使得全局变量可以同名。
*/
static 修饰函数
static修饰函数使得函数只能在包含该函数定义的文件中被调用。
在头文件b.h中声明静态函数fun(),在文件b.cpp中定义静态函数fun(),编译器会报错,指明b.h中的fun函数未定义。
对于静态函数,声明和定义需要放在同一个文件夹中。
如果将static函数定义在头文件中,则每一个包含该头文件的文件都实现了一个fun函数。因此static实现了不同文件中定义同名的函数,而不发生冲突。
在多人协同工作的项目中,为了避免出现同名的函数冲突,可以将函数定义为static,从而避免冲突的发生。
static修饰c++中的类
在C++中static不光具备C中所有的作用,而且对于静态成员变量和静态成员函数。所有的对象都只维持同一个实例。
因此,采用static可以实现不同对象之间数据共享。
class Point
{
public:
....
static void show()
{ cout << count <<endl;}
private:
...
static int count; //这里只声明,没有分配内存,没有初始化。
}
int Point::count = 0; // 这里初始化静态变量
int main()
{
Point a(4,5);
Point::show(); //也可以a.show();
}