static关键字的作用:
C/C++共有的作用:
1)修饰全局变量时,表示只对定义在同一个文件中的函数可见。
2)修饰局部变量时,表示变量的生命周期不因函数结束而终止。
3)修饰函数时,表示该函数只在同一个文件中被调用。
C++特有:
1)修饰类的成员变量,表示该成员变量属于该类,但不属于类的某个对象,所有对象共享该成员,这个成员只有一个实例。具体例子可以结合单例模式实现。
2)修饰类的成员函数,表示该成员函数只能访问它的参数,静态成员变量,静态成员函数,全局变量。
static关键字修饰的特点:
首先要了解c/c++的内存分布,以及static所在的区间。
对于一个完整的程序,在内存中的分布情况如下图:
1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用域退出而释放空间。
3.堆区:程序员分配并释放的区域,像malloc(c),new(c++)
3.全局数据区(静态区):全局变量和静态便令的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
4.代码区
- 静态局部变量的特点:
- 在全局数据区分配内存(局部变量在栈区分配内存);
- 在程序执行到该变量的声明处时会被首次初始化,之后函数调用不再初始化(局部变量每次函数调用都会被初始化);
- 静态局部变量一般在声明处初始化,如果没有显式初始化,会被自动初始化为0(局部变量不会初始化);
- 静态局部变量始终驻留在全局数据区,直到程序结束,但是作用域是所在函数,不能在函数体外使用(局部变量在栈区,会随着函数调用结束而释放内存);
- 静态全局变量特点:
- 定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见,不能被其他文件使用;
- 其他文件可以定义相同变量名,不会产生冲突;
- 静态函数
1. 静态函数变量只在本文件中可见,不能被其他文件使用。
2.其他文件可以定义相同名字的函数,不会产生冲突。
- 静态成员变量
1.静态成员变量属于类,不属于类的某个对象,所有的对象共享该成员变量。
2.静态成员变量在类内声明,在类外定义并初始化,形式举例如下:类型 类名::变量名=初始值;
- 静态成员函数
1.静态成员函数不能访问非静态(包括成员函数和数据成员),但是非静态可以访问静态(静态成员函数属于类,不属于某个对象,对属于某个对象的非静态成员函数和数据成员一无所知,而所有对象共有静态的成员,非静态可以访问静态,静态无法访问非静态)。
2.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常)。
参考文章:https://blog.csdn.net/majianfei1023/article/details/45290467