使用の違いは何ですか:
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
、パブリックコンストラクターを宣言する必要があります。これは、常にクラスにアクセスしていることを意味しますが、クラスはコピーを取得することもできます。