使用static关键字声明对象时意味着什么?

时间:2016-12-14 12:46:04

标签: c++

我正在编写一个C ++程序,其代码部分如下所示

#include <cstdio>
class A
{
public:
    A()
    {
        puts("Create");
    }
    ~A()
    {
        puts("Destroy");
    }
};
void Test()
{
    puts("In");
    static A a; //declare an object with static keyword.
}
int main()
{
    Test();
    puts("Out");
    return 0;
}

我认为 static 关键字会使它像一个全局变量,这个程序的输出应该是

Create
In
Out
Destroy

但事实是,当我使用GCC编译它时,我遇到了一些链接器错误,

/tmp/cc1JwaFb.o: In function `Test()':
test.cpp:(.text+0x23): undefined reference to `__cxa_guard_acquire'
test.cpp:(.text+0x46): undefined reference to `__cxa_guard_release'
test.cpp:(.text+0x6e): undefined reference to `__cxa_guard_abort'
/tmp/cc1JwaFb.o:(.eh_frame+0x6b): undefined reference to `__gxx_personality_v0'
collect2: error: ld returned 1 exit status

但是我可以使用G ++编译它,它已经过时了

In
Create
Out
Destroy

那么,为什么会发生这种情况呢?使用 static 关键字声明对象时意味着什么?

1 个答案:

答案 0 :(得分:2)

这里发生的事情是第一次创建执行到static A a;A。这发生在puts("In");之后,因此输出的顺序正确。

到目前为止,所有内容都与非静态变量相同。在您的示例中,您仍然可以看到变量是静态的,因为OutDestroy之前打印(静态变量的生命周期=程序生命周期)。但是,示例中不显示静态变量的另一个属性。尝试以下主要内容:

int main()
{
    Test();
    Test();
    puts("Out");
    return 0;
}

输出结果为:

In
Create
In
Out
Destroy

您可以在此处看到“创建”仅打印一次。这就是静态变量的作用 - 当执行第一次执行到声明时,它只被初始化一次。

希望这有帮助