5.9 对象的生存期

5.9 对象的生存期

对象的生存期是指对象从被创建开始到被释放为止的存在时间。根据对象的生存期的不同,可以将对象分为以下三种类型:

1. 局部对象

局部对象是在函数体或程序块内定义的对象。当函数或程序块被调用时,构造函数被调用,局部对象被创建。当程序退出定义该对象所在的函数体或程序块时,析构函数被调用,局部对象被释放。局部对象的作用域小,生存期也短。函数的形参属于局部对象。

2. 静态对象

静态对象分为内部静态对象和外部静态对象。当程序第一次执行到定义的静态对象时,静态对象被创建,并调用构造函数。静态对象的生存期从程序开始到程序结束,因此它的生存期较长。当程序结束时,调用析构函数释放静态对象。

  • 内部静态对象:定义在函数体或程序块内,作用域小,但生存期长。
  • 外部静态对象:定义在文件中,作用域从定义时起到文件结束时止,作用域较大,生存期也较长。

3. 全局对象

全局对象定义在某个文件中,作用域包含该文件的整个程序。全局对象在程序开始时调用构造函数创建,在程序结束时调用析构函数释放。全局对象的作用域最大,生存期也最长。

示例代码

以下是一个展示不同对象生存期的例子:

#include <iostream>
#include <cstring>

class A {
public:
    A(const char *st) {
        strcpy(string, st);
        std::cout << "Constructor Called for " << string << std::endl;
    }
    ~A() {
        std::cout << "Destructor Called for " << string << std::endl;
    }
private:
    char string[50];
};

void fun() {
    static A staticObject("StaticObject");
    A funObject("FunObject");
    std::cout << "In fun()." << std::endl;
}

A globalObject("GlobalObject");

int main() {
    A mainObject("MainObject");
    std::cout << "In main(), before calling fun()" << std::endl;
    fun();
    std::cout << "In main(), after calling fun()" << std::endl;
    return 0;
}

程序输出说明

Constructor Called for GlobalObject
Constructor Called for MainObject
In main(), before calling fun()
Constructor Called for FunObject
Constructor Called for StaticObject
In fun().
Destructor Called for FunObject
In main(), after calling fun()
Destructor Called for MainObject
Destructor Called for StaticObject
Destructor Called for GlobalObject
  • 全局对象globalObject 在程序开始时被创建,并调用构造函数。程序结束时,调用析构函数。
  • 局部对象mainObjectfunObject 在进入其作用域时创建并调用构造函数。mainObjectmain() 函数结束时调用析构函数,而 funObjectfun() 函数结束时调用析构函数。
  • 静态对象staticObject 在第一次调用 fun() 时创建,并在程序结束时调用析构函数。

结论

通过上述程序和输出,可以清晰地看到不同类型对象的生存期。局部对象生存期最短,静态对象生存期长但受限于作用域,全局对象生存期最长且作用域最大。理解对象的生存期对于编写高效、可靠的代码至关重要。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值