生存周期:
我们知道,在对象或者变量从诞生到消失的这段时间,就是对象或者变量的生存周期。
生存周期分为“静态生存周期”与“动态生存周期”。
静态生存周期
静态生存周期是指如果对象或者变量从定义的那一刻起,一直到程序的结束才销毁,这样的就称这个对象或变量具有静态生存期。
静态生存期的变量有
(1)全局变量
(2)静态局部变量
(3)静态成员变量
1.全局变量:
全局变量我们很熟悉了,例如
#include<iostream>
using namespace std;
int a=5;
int main()
{
a=18;
return 0;
}
这段代码中的a就是全局变量,他从定义开始直到本程序结束才被销毁,但为了代码的通用性我们一般不建议大量使用全局变量。
2.静态局部变量:
静态局部变量一般出现在反复调用的函数中,例如:
#include<iostream>
using namespace std;
void fn(int a)
{
static n=0;
n++;
}
int main()
{
int a;
a=18;
while(a!=0)
{
fn(a);
a--;
}
return 0;
}
通过静态局部变量n我们就可以很清楚的看到该函数被调用了多少次。
3.静态成员变量
在类中 我们一般会有多个成员变量,他们代表的是我们这个类的属性。
但有的时候我们不希望该属性每个人都有,比如一个造车工厂,他造出来的每一辆车都是一个对象,但是车的属性中应该含有车的图纸,但是你买车当然不会连图纸一起卖给你,所以这时候就需要使用静态成员变量。
例如:
#include<iostream>
using namespace std;
class Person
{
private:
int id; //编号
char name[32]; // 姓名
char sex; //性别
int age; //年龄
static int count; //用来统计有多少个员工
public:
Person()
{
count++;
}
~Person()
{
count--;
}
}
int Person::count=0; //在类内定义,在类外初始化
int main()
{
Person a,b,c;
cout<<Person::count<<endl;//或者 cout<<a.count<<endl;
return 0;
}
这时候我们定义的count成员变量就是一个静态成员变量,他在创建每一个对象的时候都会自加1,在释放每一个对象时都会自减1,所以他一直表示的都是这个员工类的员工总人数。
但是当我们没有定义任何对象的时候,我们是不能通过对象来访问count的,而且我们也不希望通过对象来访问count,所以我们希望专门有一个函数来输出count
所以我们可以定义一个静态函数
例如:
static void showCount()
{
cout<<count<<endl;
}
这样就可以在任何时候通过showCount函数来访问count了
## 静态成员函数的特点:
(1)静态成员函数没有this指针,正因为他没有this指针,他才可以不通过对象来对静态成员变量进行访问。
(2)静态成员函数中,无法对本类的非静态成员进行默认访问
例如:
static void showCount()
{
id=9527;
}
这样是会报错的,因为我们知道,在成员函数中包含着一个看不见的形参,就是this指针,而静态成员函数并没有this指针,所以它并不知道这个id是那一个对象的id,这样一来就会报错。
动态生存周期
动态生存周期就是对象或者变量从定义开始,到其所在函数或者语句块结束时被销毁。
例如:
for(int i=0;i<10;i++)
{
cout<<i<<endl;
}
这里面的i就是一个局部变量,他的生存周期就是动态生存周期,i从定义开始,到for循环结束而消失, 同样的还有函数的形参等,函数的形参从定义开始一直到其所在函数结束而被销毁。