对象有诞生和消亡的时刻,对象从诞生到结束的时间就是其生存期。在生存期内对象将保持其状态,变量将保持其值不变。对象的生存期可以分为静态生存期和动态生存期两种。
静态生存期
静态生存期与程序的运行期相同,在命名空间作用域声明的对象都是具有静态生存周期,在函数的局部作用域可以通过关键字static来声明。
- 不会每次函数调用都生成一个副本;
- 不会随着函数返回而失效;
- 变量可以在每次调用间共享;
动态生存期
动态生存期产生于声明点,结束于声明所在的块执行完毕之时。
#include <iostream>
using namespace std;
//静态生存期例子
void fn1()
{
static int n = 0;
n++;
cout << "n的值为" << n << endl;
}
int main()
{
for (int i = 0; i < 10; i++)
{
fn1();
}
return 0;
}
#include <iostream>
using namespace std;
//动态生存期 变量n每次调用都初始化
void fn1()
{
int n = 0;
n++;
cout << "n的值为" << n << endl;
}
int main()
{
for (int i = 0; i < 10; i++)
{
fn1();
}
return 0;
}
类的静态成员
类的静态成员包括静态数据成员和静态函数成员两种。
静态数据成员可以实现对象与对象间数据的共享。
#include <iostream>
using namespace std;
class Point
{
public:
Point(int x = 0, int y = 0) : x(x), y(y)
{ //构造函数
count++;
}
Point(Point &p)
{ //复制构造函数
this->x = p.x;
this->y = p.y;
count++;
}
~Point()
{ //析构函数
count--;
}
int getx()
{ //外部get接口
return x;
}
int gety()
{
return y;
}
void showCount()
{
cout << "Object Count is : " << count << endl;
}
private:
int x, y; //普通数据成员
static int count; //声明静态数据成员count
};
int Point ::count = 0;
int main()
{
Point a(3, 4); //子子孙孙无穷匮?
Point b(a);
cout << "b x:" << b.getx() << "b y:" << b.gety() << endl;
b.showCount();
Point c(b);
Point d(c);
cout << "d x:" << d.getx() << "d y:" << d.gety() << endl;
d.showCount();
return 0;
}
而静态函数成员可以使用类名直接调用,不依赖对象而存在,可以将上文的showCount函数修改为静态函数成员。
#include <iostream>
using namespace std;
class Point
{
public:
Point(int x = 0, int y = 0) : x(x), y(y)
{ //构造函数
count++;
}
Point(Point &p)
{ //复制构造函数
this->x = p.x;
this->y = p.y;
count++;
}
~Point()
{ //析构函数
count--;
}
int getx()
{ //外部get接口
return x;
}
int gety()
{
return y;
}
static void showCount() //修改为静态函数成员
{
cout << "Object Count is : " << count << endl;
}
private:
int x, y; //普通数据成员
static int count; //声明静态数据成员count
};
int Point ::count = 0;
int main()
{
Point a(3, 4); //子子孙孙无穷匮?
Point b(a);
cout << "b x:" << b.getx() << "b y:" << b.gety() << endl;
Point::showCount();//使用类名调用静态函数成员
Point c(b);
Point d(c);
cout << "d x:" << d.getx() << "d y:" << d.gety() << endl;
Point::showCount();
return 0;
}