📜  静态物体什么时候被破坏?

📅  最后修改于: 2021-05-25 21:48:22             🧑  作者: Mango

对这两个人保持谨慎
新朋友和老敌人
—卡比尔

什么是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
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”