前言
大家好我是jiantaoyab,这篇文章来谈一谈c++中的static,根据对static的使用,我分为类内和类外2种情况
static简介
static是c++常用的修饰符,它用来控制变量的存储方式和可见性,在变量前面加上一个static,就会变成一个静态的变量,静态变量在全局数据区分配内存,全局数据区的数据并不会因为函数的退出而释放空间
类外面的static
static全局变量
#include<iostream>
static int x;
int main()
{std::cout << x << std::endl; //输出为0
}
可以看出static全局变量没有初始化的话编译器给的值默认为0
还有什么性质呢?
我们这里声明的x只能在当前的文件下使用,其他的文件中也能定义一个名字叫x的变量和当前文件的x没有冲突,有点像类的private,是当前文件的私有变量
static局部变量
int add()
{int x = 0;return x += 3;
}
int main()
{int ret = add();ret = add();std::cout << ret << std::endl;
}
我们这里的里调用了2次add函数,结果ret却只等于3为什么x没有进行累加呢?
在函数内部定义的变量是保存在栈中的,函数调用完之后,就销毁了,等再次调用的时候又是一次新的赋值,所以我们第一次调用的结果并没有保存下来。
假如我们给x加上static之后,就会保存在全局数数据区,是在程序终止的时候才销毁,延长了x变量的生命周期
类中的static
class Stu
{
public:int id;static int phone;
};//类中的static变量要在类外面定义/初始化
int Stu::phone;
int main()
{Stu s1, s2;s1.phone = 111111;s2.phone = 222222;return 0;
}
调试
我们发现这里的2个不同等对象定义的变量phone的值是一样的,就连地址也是一样的,为什么呢?
对于非静态成员变量,每个类对象都有自己的拷贝,而静态成员变量只有一份,对这个类中所有的对象都是共享的
假如我定义一个static的成员函数是不是也是类内共享的呢?
是的,但static成员函数有挺多要注意的点
- 静态的成员函数不需要对象就能调用
class Stu
{
public:static void Print1(){std::cout << " Print1()" << std::endl;}void Print2(){std::cout << " Print2()" << std::endl;}};
int main()
{Stu::Print1(); //trueStu::Print2(); //error//几种调用方式Stu s1;s1.Print1();Stu* s2 = &s1;s2->Print1();Stu::Print1(); return 0;
}
-
在静态成员函数中使用非静态的成员变量和访问非静态成员函数是不可以的,这里涉及到一个this指针的问题
-
静态成员之间可以相互访问,包括静态成员函数访问静态变量和访问静态成员函数
-
非静态成员函数可以任意地访问静态成员函数和静态成员变量