对象的生存期

对象有诞生和消亡的时刻,对象从诞生到结束的时间就是其生存期。在生存期内对象将保持其状态,变量将保持其值不变。对象的生存期可以分为静态生存期和动态生存期两种。

静态生存期

静态生存期与程序的运行期相同,在命名空间作用域声明的对象都是具有静态生存周期,在函数的局部作用域可以通过关键字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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值