7

使用の違いは何ですか:

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

と:

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

// ...

GetFoo().func();

どちらが良いですか?

4

2 に答える 2

10

主な違いは、建設が行われる時期です。最初のケースでは、main()開始前のある時点で発生します。2番目のケースでは、への最初の呼び出し中に発生しGetFoo()ます。

最初のケースでは、コードがfoo初期化される前に(違法に)使用される可能性があります。2番目のケースではそれは不可能です。

于 2012-08-30T00:44:13.527 に答える
1

AGetFooは通常、クラス/オブジェクトのコピーが必要ない場合に使用されます。例えば:

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

    int singleobject;
};

singleobjectを介して外部からアクセスできますFoo::GetFoo()->sinlgeobject。プライベートコンストラクタとデストラクタは、クラスがコピーを作成するのを防ぎます。

を使用するにはstatic Foo foo、パブリックコンストラクターを宣言する必要があります。これは、常にクラスにアクセスしていることを意味しますが、クラスはコピーを取得することもできます。

于 2012-08-30T01:04:16.387 に答える