1

C++ がどのように機能するかについてはよく理解していましたが、その使用方法について混乱しています。.cpp ファイル (クラスに関連付けられていない) でクラス インスタンスをグローバルに宣言すると、次のようになります。

Class b(constructor parameters)

問題はありません。私の理解では、クラスをこのように宣言すると、ヒープではなく、メソッドのスタック フレームにクラスが割り当てられました。しかし、これをグローバルに宣言すると、メソッドがないため、スタックフレームがありませんよね? なぜ私はこれを行うことが許されているのですか? さらに重要なことに、何が起こっているのでしょうか?

4

3 に答える 3

3

これは単なる静的オブジェクトです。他のグローバル変数と同じように扱われます。

スタック フレームには関連付けられず、ファイル内の何かが初めて読み込まれるときに作成されます。

一般に、設計の観点からグローバルに依存することはお勧めしません。それは依存しますが、それらは合理的です。

何らかのスレッド化を行っている場合、それらが問題になる可能性があります。また、アプリケーションのさまざまな部分を最小限に抑えたいと考えていますが、物事がグローバル変数であることを知っていると、多くのスパゲッティ コードが発生します。

変数がファイルの外部で参照されていない場合、または分野横断的な懸念のために参照されていない場合は、それが良いこともあります。

最善のアドバイスは、できる場合は避けること、できない場合は過度に設計しないことです。

于 2012-06-17T21:28:13.797 に答える
1

グローバル変数 (より正確には「名前空間スコープの」変数) であるオブジェクトには、静的な保存期間があります。これは、それらがプログラムの最後まで存続し、プログラムの起動時に初期化されることを意味します (静的または動的初期化フェーズのいずれか)。

一般に、初期化の順序は指定されていませんが、このようなグローバル オブジェクトはすべてmain()が呼び出される前に初期化され、初期化によってデータ競合が発生しないという点が異なります。

(相互に依存するグローバル初期化を順序付ける一般的な手法は、ネイキッド グローバル変数をグローバル ゲッター関数とブロック静的変数に置き換えることです。

Foo & getFoo() { static Foo impl; return impl; }

getFoo()独自のコンストラクターで使用する他のグローバルは、 の implに初期化されます。)

于 2012-06-17T22:37:44.893 に答える
0

クイックコメント

投稿のタイトルを次のように変更できます。

C++ ファイルでグローバル クラス インスタンスを宣言しますか?

また:

C++ で、宣言され、後でメモリに格納されたグローバルオブジェクトはどのように機能しますか?

私は間違っているかもしれませんが、あなたは他のオブジェクト指向プログラミング言語や参照ベースのプログラミング言語を扱っており、C++ での経験を応用しようとしているように思えます。


C++、その混合: 手続き型プログラミングとオブジェクト指向プログラミング、および関数型のような他のもの。

手続き型プログラムを単一のオブジェクトとして表示したい場合があります。このクラスはすでに宣言されており、インスタンスが作成されています。そして、コンストラクターmainのように自動的に実行されるこのパブリックメソッドがあります。

次のような C++ ファイルを読み取ると、次のようになります。

// file: "example.cpp"

// class declaration without local variables
class CoordinateClass
{
  int x;
  int y;
};

// a global variable
CoordinateClass MyCoordinates;

int main (char[][] args)
{
  // dont care about this in this example
  int ErrorCode = 0;

  // DoSomething();

  // dont care about this in this example
  return ErrorCode;
} // int main()

あなたは次のように考えたいかもしれません:

// file: "example.cpp"

public: class example: program
{
  public:
    // class declaration without local variables
    class CoordinateClass
    {
      int x;
      int y;
    };

   // a global variable, works like a field of a class
   CoordinateClass MyCoordinates;

   int main (char[][] args)
   {
     // dont care about this in this example
     int ErrorCode = 0;

     // DoSomething();

     // dont care about this in this example
     return ErrorCode;
   } // int main()   

};

// this is done automatically:
example MyExample;
MyExample.main();

乾杯。

于 2012-06-17T23:08:59.287 に答える