static 的使用
1.1 static声明静态全局变量
static变量只能在定义它的文件中使用。这里的文件指的是cpp源文件。如果在头文件中定义了static变量,那么,所有包含这个头文件的源文件都会定义自己的static变量,而不是使用该头文件中的static变量。其实就是有多少个cpp包含了这个头文件,就存在多少个该变量。这样说可能不是很明白,直接看代码吧!
a.h
static bool test = true;
void print_test();
a.cpp
#include "a.h"
void print_test()
{
if (test)
{
std::cout << "test is true!"<<std::endl;
return;
}
else
{
std::cout << "test is false!"<<std::endl;
}
return;
}
b.h
#include "a.h"
void b_print_test();
b.cpp
void b_print_test()
{
test = false;
if (test)
{
std::cout << "test is true!" << std::endl;
return;
}
else
{
std::cout << "test is false!" << std::endl;
}
return;
}
int main()
{
b_print_test();
print_test();
}
运行结果如下
因此使用static定义变量时,放在源文件中,若想声明外部可用的全局变量,可以使用extern关键字。
1.2 static声明静态局部变量
与静态全局变量的区别是,静态全局变量作用域是本文件内,而静态局部变量的作用域是本函数内,一样是在静态存储区分配空间
1.3 static声明函数
static声明的函数有两种
- 类内声明的成员函数
静态成员函数的作用在于:调用这个函数不会访问或者修改任何对象(非static)数据成员。其实很好理解,类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。 - 普通的全局的静态函数。
这样的static函数与普通函数的区别是:用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用。