1. 静态局部变量
静态局部变量声明在某个函数体中,其他函数不能使用。
静态局部变量的特殊之处在于,函数被调用N次,初始化语句只会执行一次,之后则会取在内存静态区中储存的上次函数调用结束时该静态变量的值,而不是初始化语句。
#include<iostream>
using namespace std;
void Static()
{
static int n = 1;
n *= 2;
cout << "静态变量:" << n << endl;
}
void Auto()
{
int n = 1;
n *= 2;
cout << "普通变量:" << n << endl;
}
int main()
{
Static();//2
Static();//4
Static();//8
Static();//16
Auto();
Auto();
Auto();
Auto();
return 0;
}
因静态局部变量的特殊之处,我们可以记录函数的调用次数
深度分析
用于函数体内部修饰变量,这种变量的生存期长于该函数。
int foo(){
static int i = 1; // note:1
//int i = 1; // note:2
i += 1;
return i;
}
对于一个完整的程序,在内存中的分布情况如下:
- 1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间。
- 2.堆区:程序员分配并释放的区域,像malloc(c),new(c++)。
- 3.全局数据区(静态区):全局变量和静态变量的存储是放在一块的(区别?C/C++基础知识---全局变量和静态全局变量-CSDN博客C/C++基础知识---全局变量和静态全局变量-CSDN博客C/C++基础知识---全局变量和静态全局变量-CSDN博客),初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
- 4.代码区
c++中static的用法详解 - 知乎 (zhihu.com)
2. 静态全局变量
定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。
它跟全局变量有什么区别呢?C/C++基础知识---全局变量和静态全局变量-CSDN博客
#include <iostream>
using namespace std;
//int i = 10; //note:3
static int i = 10; //note:4
int foo()
{
i += 1;
return i;
}
int main(void)
{
int res=foo();
cout << res << endl;
return 0;
}
note:3 和 note:4 有什么差异呢?如果只调用一次foo的情况下
现在定义一个a.cpp和一个b.cpp 分别使用note:3方案和note:4方案
a.cpp
int i = 10; //note:3
//static int i = 10; //note:4
b.cpp
#include <iostream>
using namespace std;
extern int i;
void fn()
{
i++;
printf("after: %d\n", i);
}
void main()
{
printf("before: %d\n",i);
fn();
}
note:3全局变量
note3:静态全局变量
因为 static 进行了文件隔离,你是无法在b文件,访问到a文件的静态成员变量的。除非你使用#includexxx
以上我们就可以得出静态全局变量的特点:
- 静态全局变量不能被其它文件所用(全局变量可以);
- 其它文件中可以定义相同名字的变量,不会发生冲突(自然了,因为static隔离了文件,其它文件使用相同的名字的变量,也跟它没关系了);
3. 静态函数
静态函数的好处跟静态全局变量的好处就类似了:
- 静态函数不能被其它文件所用;
- 其它文件中可以定义相同名字的函数,不会发生冲突;
4. 类的静态成员
会一直存在于程序的整个生命周期中,不会像普通变量一样随着对象的存在而存在,消亡而消亡。
(1)因为静态成员是属于类而不是属于单个对象的,所以静态成员用来记录类相关的信息;
(2)比如:用静态成员来统计创建了多少个类的对象;
#include <iostream>
using namespace std;
class Person
{
private:
public:
int age; // 普通成员变量
static int cnt; //统计程序存在的中类的对象个数
Person(void); //构造函数
~Person(void); //析构函数
};
//在构造函数中cnt加一
Person::Person(void)
{
age = 18;
Person::cnt++; //方式1
//cnt++; //方式2
//this->cnt++; //方式3
}
//在析构函数中cnt减一
Person::~Person(void)
{
Person::cnt--;
}
// 对Person类中的静态成员定义
int Person::cnt;//int Person::cnt=9;
int main(void)
{
cout << "Person::cnt = " << Person::cnt << endl;
Person* p1 = new Person();
cout << "Person::cnt = " << Person::cnt << endl;
Person* p2 = new Person();
cout << "Person::cnt = " << Person::cnt << endl;
Person* p3 = new Person();
cout << "Person::cnt = " << Person::cnt << endl;
delete(p1);
cout << "Person::cnt = " << Person::cnt << endl;
delete(p2);
cout << "Person::cnt = " << Person::cnt << endl;
delete(p3);
cout << "Person::cnt = " << Person::cnt << endl;
return 0;
}
(1)静态变量和普通变量的区别:静态变量在类中只是用static来声明,需要在类外进行定义;
(2)创建Person类的对象时会调用构造函数,构造函数会对cnt加一;
(3)销毁Person类对象时会调用析构函数,析构函数会对cnt减一;
上面代码的效果:用类的cnt静态变量来统计程序中还存放多少个Person类的对象;