C/C++static关键字用法总结
static若修饰以下时:
全局变量 外延性 ,加上static后, 作用域仅限于本文档
局部变量 存储位置从栈上变成data段的rw段(未初始化时放在bss段),生命周期跟整个进程的周期一样
1,类外
1static全局变量
static int a;
这个变量的含义是在该cpp内有效,但是其他的cpp文件不能访问这个变量;如果有两个cpp文件声明了同名的全局静态变量,那么实际上他们是独立的两个变量。
2,static局部变量
void func()
{
static int a;
}
静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
3,只在cpp内有效的全局函数
static void fun();
函数的实现不需要static修饰,那么这个函数只可在本cpp内使用,不与其他cpp中的同名函数引起冲突;
2,类内
1,static成员变量
在生成对象的时候,普通数据成员才有空间。而 static 成员在类声明的时候,就已经开辟了空间,在data rw段。
static 数据成员,既属于类,也属于对象,但终归属于类。
static数据成员要在类外进行初始化,使用类的作用域来进行初始化。
#include<iostream>
using namespace std;
class A
{
public:
void print()
{
cout << share << endl;
}
void func(int m)
{
share = m;
}
static int share; //类外初始化
};
int A::share = 10;
int main()
{
A a,b,c;
a.print(); //10
b.func(100);
b.print();//100
c.print();//100 static share 属于类
}
2,static成员函数
作用只有一个,用于管理static成员。
static修饰的成员函数,既属于类也属于对象,但终归属于类
static修饰的成员函数,因为它属于类,所以没有 this 指针 ,不能访问非static数据成员,以及成员函数