全局静态变量和函数内静态变量有什么区别?

7

使用中有什么区别:

static Foo foo;
// ...
foo.func();

同时:

Foo& GetFoo(void) 
{
    static Foo foo;
    return foo;
}

// ...

GetFoo().func();

哪个更好?


使用全局变量会存在命名冲突的风险。 - VoidStar
请参见https://dev59.com/E2ct5IYBdhLWcg3wULzo。 - Pete Becker
@VoidStar:使用全局函数会存在命名冲突的风险。 - Mike Seymour
2个回答

10

主要区别在于构造发生的时间。在第一种情况下,它发生在 main() 开始之前的某个时刻。而在第二种情况下,它发生在第一次调用 GetFoo() 期间。

在第一种情况下,代码有可能在初始化 foo 之前(非法地)使用它。而在第二种情况下,这是不可能的。


虽然意图是正确的,但是通过对函数进行递归调用,在初始化之前可以使用函数静态(在C++03中)。 - David Rodríguez - dribeas

1

GetFoo 通常用于当您不想要类/对象的副本时。

例如:

class Foo
{
private:
    Foo(){};
    ~Foo();
public:
    static Foo* GetFoo(void) 
    {
        static Foo foo;
        return &foo;
    }

    int singleobject;
};

您可以通过Foo::GetFoo()->sinlgeobject外部访问singleobject。私有构造函数和析构函数避免了创建类的副本。

对于使用static Foo foo,您必须声明公共构造函数,这意味着您始终通过它来访问您的类,但是您的类也将能够获得副本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接