使用の違いは何ですか:
static Foo foo;
// ...
foo.func();
と:
Foo& GetFoo(void)
{
static Foo foo;
return foo;
}
// ...
GetFoo().func();
どちらが良いですか?
使用の違いは何ですか:
static Foo foo;
// ...
foo.func();
と:
Foo& GetFoo(void)
{
static Foo foo;
return foo;
}
// ...
GetFoo().func();
どちらが良いですか?
主な違いは、建設が行われる時期です。最初のケースでは、main()開始前のある時点で発生します。2番目のケースでは、への最初の呼び出し中に発生しGetFoo()ます。
最初のケースでは、コードがfoo初期化される前に(違法に)使用される可能性があります。2番目のケースではそれは不可能です。
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、パブリックコンストラクターを宣言する必要があります。これは、常にクラスにアクセスしていることを意味しますが、クラスはコピーを取得することもできます。