2011-07-01 8 views
1

以下のC++のコードフラグメントを参照してください。これらの変数の範囲はどのくらいですか?

#include ..... 

Class1 class1; 
Class2 class2; 
... 

void Class3::foo() { 
    ... 
} 

変数どのようなものです:クラス1とクラス2は?彼らはグローバル変数ですか?静的変数?これらは実際何ですか? C++オブジェクト指向プログラミングでは、ファイル内のどのクラスのメンバ関数でもそれらにアクセスできるので、これらを使用することをお勧めしますか?

初心者の方にはごめんなさい。

ありがとうございました。

+0

[グローバル変数が間違っていますか?](http://stackoverflow.com/questions/484635/are-global-variables-bad) –

+1

重複していることに注意してください。それらがグローバルであるかどうかの問題ではありません。 –

+1

注: "グローバルな名前空間で宣言された名前(すなわち、TUの最も外側の宣言的な領域)は* global *と言われていますが、この用語は名前空間スコープの名前を記述するために間違って使われることがあります。 –

答えて

8

はいclass1 & class2はグローバル変数です。

グローバル変数とは何ですか?
ブロック外で宣言された変数はグローバル変数と呼ばれます。グローバル変数にはプログラム範囲があります。つまり、プログラム内のどこにでもアクセスでき、プログラム終了時にのみ破壊されます。

グローバル変数はプログラムスコープを持つため、複数のファイルにまたがって使用できます。別のファイルで宣言されているグローバル変数を使用するには、前方宣言またはヘッダーファイルとexternキーワードを使用する必要があります。 Externは、新しい変数を宣言するのではなく、他の場所で宣言されている変数を参照していることをコンパイラに伝えます。

C++ OOプログラミングでは、ファイル内のどのクラスのメンバー関数でもアクセスできるため、これらを使用することをお勧めしますか?通常

ので、人々はグローバル変数を使用します。彼らはC++の変数通過力学を理解していない、または、彼らは怠け者だ

  • プログラム全体で使用する必要のあるデータを保持する(設定など)。呼び出し元/呼び出し先の関係(例えば、マルチスレッドプログラムを)持っていないコードの間でデータを渡すために

しかし、グローバル変数は悪です!
なぜですか?
単純な理由から、プログラムの複雑さが多岐にわたっています。
グローバル変数が変更されるのを追跡するのは、複数のファイルのどこでも変更できるため、追跡するのは難しいです。

マルチスレッドプログラムでは、複数のスレッドがこれらのグローバル変数を獲得しようと競争する可能性があります。したがって、これらのグローバル変数は、何らかの同期メカニズムによって常に保護される必要があります。通常、システム全体を理解していない限り、そのような仕組みを理解して記述することは難しいです。

質問がありましたので、
静的変数とは何ですか?
static変数は、キーワードstaticで修飾される変数です。

静的変数とグローバル変数との違いは何ですか?
考慮すべき重要な差別化ポイントは:

スコープ:オブジェクトの
スコープオブジェクトがアクセスされて、この位置で(その名前によって知られている)表示されているかどうか..

静的変数は、定義されているブロックに対してローカルですが、グローバル変数はプログラム全体の任意のファイルからアクセスできます。

2

これらはグローバル変数(ここではオブジェクト)です。局所変数またはオブジェクトは、メソッド、関数、またはクラス(基本的には囲みブロックの内側)の内部で宣言され、その外部からはアクセスできません。あなたが言ったように、同じスコープ内のものはそれらにアクセスできるので、一般的にはグローバルを使用すべきではありません。しかし、あなたがそれらを必要とするかもしれないことがわかるいくつかのケースはいくつかあります。このような方法で多くの関数に変数を渡す必要が本当にある場合は、参照渡しするほうが良いかもしれません。

0

class1およびclass2はグローバル変数です。いい練習ですか?おそらくそうではない。そのような変数の初期化順序を翻訳単位に依存することはできません。

は、次のイディオムを使用して、信頼性の高い順序を達成することができます

inline Class1& getClass1() { 
    static Class1 object; 
    return object; 
} 

あなたはClass1オブジェクトが(あなたがそれを必要とする右の前に)初期化されようとしている正確にいつ知っている、これを使用します。

関連する問題