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
在程序开始时被创建,并调用构造函数。程序结束时,调用析构函数。 - 局部对象:
mainObject
和funObject
在进入其作用域时创建并调用构造函数。mainObject
在main()
函数结束时调用析构函数,而funObject
在fun()
函数结束时调用析构函数。 - 静态对象:
staticObject
在第一次调用fun()
时创建,并在程序结束时调用析构函数。
结论
通过上述程序和输出,可以清晰地看到不同类型对象的生存期。局部对象生存期最短,静态对象生存期长但受限于作用域,全局对象生存期最长且作用域最大。理解对象的生存期对于编写高效、可靠的代码至关重要。