可以在C ++中将匿名对象声明为静态吗?

时间:2008-12-24 16:22:01

标签: c++ static anonymous

这是允许的吗? :

class A;
void foo()
{
    static A();
}

当我尝试这样做时,我收到信号11,但以下情况正常:

class A;
void foo()
{
    static A a;
}

谢谢。

4 个答案:

答案 0 :(得分:4)

不。在C ++中没有“匿名对象”这样的东西。存在这样的事情:定义要立即丢弃的类型A的对象;你写的是一个表达式,它返回一个永远不会分配给变量的A对象,就像从未分配或使用printf的返回代码一样。

在该代码中,如果它有效,那么您将声明在堆外部分配“无对象”。由于没有分配对象,所以没有意义。

答案 1 :(得分:4)

您可以创建“匿名”自动变量,但不能创建静态变量。下面将创建一个A类对象并调用构造函数,然后在函数exit上调用析构函数。

class A;
void foo()
{
    A();
}

您可以通过在堆上分配对象或在预先分配的位置分配constructing it in place来获得类似的效果。

void foo()
{
    new A();
}

void foo()
{
    static char memory[sizeof (A)];
    new (memory) A();
}

但是,在这两种情况下都无法正确清理对象,因为没有保留指针以便以后调用delete。即使静态内存将被释放,析构函数也永远不会被调用。自从与垃圾收集器一起使用时,匿名对象才真正生成。

答案 2 :(得分:3)

不知何故,我认为这个人是在单身构造函数的副作用之后。

无论如何,只是给这个darn一个变量名。

答案 3 :(得分:0)

当然在C ++中有匿名对象! 此示例中的A(100) is anonymous object

但是如果你考虑一下,创建静态匿名对象是没有意义的。