📌static作用“改变生命周期” 或者 “改变作用域
变量默认初始化为0
保持变量内容的持久
全局隐藏
表示这个局部变量是在静态存储区分配的空间,在函数调用结束后其占用的存储单元并不释放,仍然保留原值。
此外,静态局部变量是在编译时赋一次初值,程序运行时每次调用函数都不再重新赋初值,而是使用前次函数调用结束时的值。
若程序不赋初值,则编译时自动赋值0(普通局部变量不赋初值的话,其值不确定)。
表示这个全局变量只能用于本文件,而不能被别的文件引用(即使使用了extern来扩展使用域),这样就能在不同文件中使用相同的全局变量名,提高了程序的通用性和可移植性。
📌ps:全局变量和静态全局变量都存放在静态存储区中,都是在编译时分配内存,只是作用域不同(全局变量可以在其他文件中用extern扩展使用域)。
表示此函数只能被本文件中的其他函数调用(称为内部函数),这样在不同文件中就可以使用相同函数名,只要用static声明即可。
static 成员变量的特点
这个类的所有对象共享一个静态成员,所以先于类的对象而存在的.
如果静态成员是公有的,那么可以直接通过类名调用.
静态成员数据在声明时候必须在类外初始化, 因为静态成员变量是先于类的对象而存在的.
static 成员变量的优点
用static修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,
用static修饰的变量在静态存储区生成的,所以用static修饰一方面的好处是可以节省对象的内存空间。
static 成员变量的示例
//通过静态成员函数来获得学生的总人数和总成绩
#include
using namespace std;
class Student{
public:
Student(char *name, int age, float score);
void show();
public: //声明静态成员函数
static int getTotal();
static float getPoints();
private:
static int m_total; //总人数
static float m_points; //总成绩
private:
char *m_name;
int m_age;
float m_score;
};
int Student::m_total = 0;
float Student::m_points = 0.0;
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
m_total++;
m_points += score;
}
void Student::show(){
cout< show();
(new Student("李磊", 16, 80.5)) -> show();
(new Student("张华", 16, 99.0)) -> show();
(new Student("王康", 14, 60.8)) -> show();
int total = Student::getTotal();
float points = Student::getPoints();
cout<<"当前共有"< 📌PS:C++中不存在静态类