对这两个人保持谨慎
新朋友和老敌人—卡比尔
什么是C++中的static关键字?
static关键字可以应用于C++中的局部变量,函数,类的数据成员和对象。静态局部变量在函数调用之间保留其值,并且仅初始化一次。可以使用范围解析运算符直接在类名之前调用static函数(有关更多详细信息,请参见此,此和此)。 C++还支持静态对象。
什么是C++中的静态对象?
当对象的声明中使用static关键字时,该对象将变为静态。例如,请参见以下两个C++语句。
Test t; // Stack based object
static Test t1; // Static object
执行时的第一条语句在堆栈上创建对象,意味着在堆栈上分配存储。基于堆栈的对象也称为自动对象或本地对象。静态对象仅初始化一次,并且一直存在直到程序终止。每当在程序执行中遇到其声明时,都会创建该本地对象。
静态对象被分配到静态存储区中。静态对象在程序终止时被销毁。 C++同时支持本地静态对象和全局静态对象
以下是显示局部静态对象使用的示例。
#include
class Test
{
public:
Test()
{
std::cout << "Constructor is executed\n";
}
~Test()
{
std::cout << "Destructor is executed\n";
}
};
void myfunc()
{
static Test obj;
} // Object obj is still not destroyed because it is static
int main()
{
std::cout << "main() starts\n";
myfunc(); // Destructor will not be called here
std::cout << "main() terminates\n";
return 0;
}
输出:
main() starts
Constructor is executed
main() terminates
Destructor is executed
如果我们仔细观察该程序的输出,可以看到名为obj的本地对象的析构函数在其构造函数执行后未被调用,因为该本地对象是静态的,因此在整个程序生命周期之前它都有作用域,因此它将是析构函数。在main()终止时调用。
当我们在上面的程序中删除static时会发生什么?
作为实验,如果我们从全局函数myfunc()中删除static关键字,则会得到如下输出:
main() starts
Constructor is called
Destructor is called
main() terminates
这是因为该对象现在是基于堆栈的对象,并且在超出范围时会被销毁,并且将调用其析构函数。
全局静态对象如何?
下面的程序演示了全局静态对象的用法。
#include
class Test
{
public:
int a;
Test()
{
a = 10;
std::cout << "Constructor is executed\n";
}
~Test()
{
std::cout << "Destructor is executed\n";
}
};
static Test obj;
int main()
{
std::cout << "main() starts\n";
std::cout << obj.a;
std::cout << "\nmain() terminates\n";
return 0;
}
输出:
Constructor is executed
main() starts
10
main() terminates
Destructor is executed