static变量保存在全局数据区,static函数保存在代码区。static起到隐藏、类共享成员作用。
static数据特点
- static变量只被初始化一次,默认初始化为0;
- static变量保存在全局数据区,全局变量作用域具有全局可见性,static全局变量作用域具有文件内可见性,生存周期贯穿整个程序生命周期;static局部变量作用域具有局部可见性,生存周期也是贯穿整个程序生命周期,但是出了局部作用域便不可见;
- static函数保存在代码区。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static int a;
static int b;
void f1(){
std::cout<<"hello"<<std::endl;
}
void f2(){
std::cout<<"hello"<<std::endl;
}
static void f3(){
std::cout<<"hello"<<std::endl;
}
static void f4(){
std::cout<<"hello"<<std::endl;
}
int main(int argc, char* argv[]){
// 静态变量放在全局数据区
// 静态函数放在代牧区
std::cout<<&a<<std::endl // 0x408024
<<&b<<std::endl // 0x408028
<<(void*)&f1<<std::endl // 0x401410 占2e
<<(void*)&f2<<std::endl // 0x40143e 占2e
<<(void*)&f3<<std::endl // 0x40146c 占2e
<<(void*)&f4<<std::endl; // 0x40149a 占2e
return 0;
}类外static起到隐藏作用
- 分离式编译中隐藏其它文件的全局变量
- 分离式编译中隐藏其它文件的全局函数至于隐藏的原理,后续在补充,还没看到相关博客内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// b.cpp
int a;
static int b;
void f1() { std::cout<<"hello world"<<std::endl; }
static void f() { std::cout<<"hello world 2"<<std::endl; }
// a.cpp
int main(int argc, char* argv[]){
extern int a;
extern void f1();
std::cout<<a<<std::endl; // 0
f1(); // hello world
// error: conflicting specifiers in declaration of 'b'
extern static int b;
// error: conflicting specifiers in declaration of 'f2'
extern static void f2();
return 0;
}
类内static成员
- 类的静态数据成员,静态函数成员属于整个类而非对象,没有隐式的指针,因此静态成员函数不能声明为const,只能访问静态数据成员和静态函数成员;
- 静态成员函数不能为虚函数(虚函数存在this指针动态绑定过程);
- 静态成员存储空间在类的存储空间外;
- 静态成员在类外初始化,在类内声明。