static关键字是我们在c/c++中常用的一个,应用它之后会有一定的效果。单放在那,没什么意思。主要用来修饰我们的变量和函数。
一.修饰变量
1.全局变量
static int global1 = 1;
static int global2;
1.被static修饰之后,这两个变量的访问权限就只能是在本文件中,工程下的其他文件不可见。
2.其次,未初始化或者初始化为0的变量被放置在bss段。
3.生命周期直至程序结束。
2.局部变量
void fun()
{
static int t1 = 2;
static int t2;
}
1.这两个变量的访问权限就只能在本函数中,每次调用该函数,t1,t2还是上次调用结束了的值。
2.同样满足上面第二条,第三条。
3.类中变量
class Test
{
public:
static int inner;
};
int Test::inner = 2;
1.类中被static修饰的变量属于该类拥有,该类的所有对象都可以访问。
2.必须在类外初始化,否则编译错误。
3.这玩意是属于类的,因此它被放在data段。
二.修饰函数
1.普通函数
//Test.cpp
static void fun()
{
cout<<"global fun"<<endl;
}
//Main.cpp
extern void fun();
void main()
{
fun();
}
1.链接错误,因为fun只在Test文件中可见,main中找不到fun的实现。
2.既然仅本文件可见,那么其他文件中的static void fun();函数就可以同时出现。
2.类中函数
class Test
{
public:
static void fun()
{
cout<<" class inner fun"<<endl;
}
}
1.我们已知用对象调用类的非静态函数时,编译器会隐式的将对象的this指针传入要调用的函数。
但是,static函数是属于类的。因此一般我们通过Test::或者以对象的形式来调用static类方法。
2.因为它不需要this指针,因此我们不能在static类方法中访问成员或者调用非静态函数。