主要参考–> 这里
写下来是为了记忆更加深刻,欢迎大家指正,希望和大家一起学习进步!
static 用法总结
- 讨论static关键字时,主要从两个方面进行:
1、作用域
2、生命周期
static 主要包括以下用法:
- 静态局部变量
顾名思义,静态局部变量是指定义在函数内部的变量,例如:
int function()
{
static int a = 1; // sign1
int b = 2; //sign2
int c = 3;
...(operations)
}
a. 作用域局限于函数 function内部,不能在函数体外使用它,运行时间是整个程序运行期间(生命周期是直到程序结束);
b. 该变量在全局数据区(常量字符串,(未)初始化的全局变量和静态变量)分布内存,局部变量在栈区分配内存;
c. 当调用函数 function 时,静态局部变量在第一次调用进入到 sign1 时被初始化,以后不管调用多少次都不需要再次初始化变量 a,而位于 sign2 的局部变量每次调用 function 都需要重新初始化;
- 静态全局变量
作用域只能是在该文件内部,生存周期为整个程序运行期间,例如现在有两个 hpp:
**********************************************
//1.hpp
static int a = 1;
int b = 2;
...
**********************************************
//2.hpp
#include<iostream>
int a = 3; // extern int a; error!!!
extern static int b;
int main()
{
int c = a + b ;
std::cout << "sum of a and b: "<< c ;
system("pause");
}
// c = 5
***********************************************
由于 1.hpp 中变量 a 只能在该文件起作用,所以可以在 2.hpp 中重新定义,并且 2.hpp 也可以直接引用变量 b;但是 2.hpp 不能直接引用 a,因为 a 的作用域限制。
Attention!:使用 #include<1.hpp>
就可以在 2.hpp 中直接使用变量 a 了.
- 静态函数
作用同静态全局变量,作用域:该文件内部,生命周期:整个程序运行期间,
别的文件不能直接调用,除非同上使用#include<1.hpp>
调用 1.hpp中的函数,所以它和静态全局变量的好处是:
1、开发者不希望这个函数或者变量在其他文件中用到或者出现;
2、开发者依旧可以在其他文件中定义名称相同的变量或者函数,避免冲突!
- 类中静态数据成员以及静态成员函数
静态数据成员:生存期大于 class 的对象(实体 instance)。多个文件使用或者继承某个类时,静态数据成员(也叫类变量)是每个 class 独一份日月更替,唯我独尊!
,普通数据成员(实例变量)是每个 instance 调用时重新赋值花心鬼!
。
好处:
1、静态数据成员节省内存,参考静态局部变量,注意: 静态数据成员存储在全局数据区,定义时要分配空间,所以不能在类声明中定义。
2、静态成员函数的好处特点:
这里 介绍的很好,我直接引用来:
1、当类的某些属性需要所有对象都能够统一公用一分内存的时候,就可以定于成静态成员变量
2、静态成员函数可以直接使用类去调用,所有当需要查看类的静态成员变量属性的时候可以直接通过静态成员函数去调用,而不需要具体对象去调用
3、因为static 成员属于类,而不属于具体的对象,所有static成员函数不能使用this指针
备注:如果有理解错误的地方,欢迎指正!