2016-10-09 7 views
-1

私は基本的に私は、私は静的メンバーを持つクラスのコンストラクタはC++でいつ実行されますか?

を行い、このコード
ヘッダファイル

class Application{ 
    public: 
     static Application& getInstance() 
     { 
      return *mInstance; 
     } 
     Application(); 
     void run(); 
     protected:   
     static Application* mInstance; 

ソースファイル

Application* Application::mInstance; 
Application::Application() 
    { 
     mInstance = this;   
    } 

を持って Cに新たなんだ++ので、私はまだそれについて多くを知らない

Application::getInstance().run(); 

Applicationクラスのコンストラクタはいつ実行されますか?
ビジュアルスタジオで動作するようです。 私の質問はなぜこれが機能するのですか?
getInstanceがnullポインタを返さないのはなぜですか?私はクラスをインスタンス化していないので。
このコードは標準ですか?
これは最新のC++コンパイラでも動作しますか?それが明示的コードによってと呼ばれるどこかそれは(スタックまたはヒープ上の)メモリ内のオブジェクトを作成している場合

+0

getInstanceの前の任意の場所にオブジェクトを作成しますか? – deviantfan

+0

コンストラクタが実行されるとき、それは "クラスのコンストラクタ"ではなく、そのクラスの特定のオブジェクトのコンストラクタです。これまでに投稿したサンプルコードは、クラスのオブジェクトを作成しません。したがって、コンストラクタは決して実行されません。 – AnT

+0

よく見る[Scott Meyerのシングル](http://stackoverflow.com/questions/30557133/singleton-and-interface-implementation/30557174#30557174) –

答えて

0

クラスのコンストラクタ、すなわちオブジェクト、に属します。したがって、コンストラクタをどこかで呼び出さなければ、決して実行されません。

これが実行できる理由は、mInstanceポインタの初期値を指定しなかったことだけです。これは、その値が定義されておらず、誤って有効なアドレスを持つ可能性があることを意味します。 run()方法はmInstanceオブジェクト自体には触れていない場合は、あなたのコードは、時にはしかしないを実行することができます。これはC++の初期化されていない変数の問題です。

右シングルトンパターンに従うことをお勧めします。 1. をnullptrとして初期化します。 2. mInstancenullptrの場合、getInstance()関数はコンストラクターを呼び出す必要があります。

(ただ、一般的なヒント:その時点でオブジェクトが完全に構築されていないと、マルチスレッドアプリケーションの場合には、それは問題を引き起こす可能性があるので、どこか別の場所にコンストラクタでthisを渡すことは避けてください)

+0

あなたの有益な答えをありがとう – user5667542

0

コンストラクタオブジェクトが構築されるたびに実行されます。

ファイルスコープの静的オブジェクトは、main()を呼び出す前に作成されます。しかし、そのような2つの静的オブジェクトの構築の順序に頼っている場合(例えば、構築がもう一方のものに依存しているなど)、潜在的に問題があります。 2つの別個のコンパイル単位(別名ソースファイル)で定義された静的な構造の順序は不特定です。

ローカル(例えば関数)の静的オブジェクトは、その関数の宣言を介して制御が渡されるときに構築されます。通常は、その関数が最初に呼び出されるためです。

関連する問題