2012-08-30 82 views
7

什么是使用之间的性差异:全局静态变量vs函数中的静态变量?

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

和:

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

// ... 

GetFoo().func(); 

哪个更好?

+0

使用全局变量可能会导致命名冲突。 – VoidStar

+0

请参阅http://stackoverflow.com/questions/12186857/on-local-and-global-static-variables-in-c。 –

+0

延迟初始化。 – iammilind

回答

10

主要区别在于施工发生时。在第一种情况下,它在main()开始之前的某个时间发生。在第二种情况下,它在第一次致电GetFoo()期间发生。

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

+0

虽然意图是正确的,但在足够的努力下,您可以在初始化之前使用函数static(在C++ 03中)对函数进行递归调用。 –

1

A 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的使用,您必须声明公共构造函数,这意味着您总是通过它访问您的类,但是您的类也将能够获得副本。