2017-08-14 7 views
0

私はC++で新しく、静的変数の概念を完全には理解していません。 私はクラス内に静的変数を持っています。クラスとその使用における静的変数とメモリの割り当て

class FCCommunication : public OEMThread 
{ 
public: 
    FCCommunication(); 
    static bool MASTER; 
} 

私は二つの文

FCCommunication * FCObject = 0; 

FCObject = new FCCommunication(); 

次使用して、ソース・ファイルでFCCommunicationに私のコードと割り当てメモリを初期化しています今私への質問は、私はMASTER変数にアクセスしようとした場合、何が起こるかということですオブジェクトおよびメモリ割り当てがこの

if(FCCommunication::MASTER)// this gets called before dynamic memory allocation. 
{ 
//do something here. 
} 
+0

多くの初心者の本とチュートリアルでは、静的メンバー変数をクラスメンバー変数*として説明しています。これは、それらがクラスの特定のインスタンスではなく*クラス*に属しているためです。そのため、静的メンバー変数を個別に定義する必要があります。つまり、インスタンスを作成する前に、静的メンバー変数(または静的メンバー関数)を使用できるということです。 –

+0

私はそれをFCCommunications :: MASTERの代わりにこのFCObject-> MASTERのように呼び出すとどういう違いがありますか?それは私のOSに支障をきたしますか?同じ配分の場合を考えてみましょう。 – SPandya

+0

保護モードのオペレーティングシステムを使用している最新のシステムでは、OSに影響するものはありません。また、特定のインスタンスを使用して静的メンバーにアクセスするのは異常ですが、無効ではありません。 –

答えて

2

静的メンバ変数が静的記憶域期間を持つ任意の他の非メンバ変数として割り当てられている:それはあなたが、このような何かをしなければならないクラス定義を外側、と言います。プログラムが開始される前に初期化されたデータのまとまりになるという意味は、インサイタイザーがゼロ値であるかどうかによって、多くの場合、.bssまたは.dataのいずれかと呼ばれます。

したがって、静的メンバー変数は実際にクラスと一緒に割り当てられず、初期化する値は残りのクラスが偶数割り当てられる前に実行されるコードによって設定されます。

これは、クラスのインスタンスが存在するかどうかにかかわらず、静的メンバーに実際にアクセスできることを意味します。それはまさに彼らのものなので、それらを「アクセスとスコープが制限されたグローバル変数」と考えることができます。

コードが適切であることを意味します。

+0

ありがとう、それはかなり役に立ちました。インスタンスが存在しない場合には、もう1つの疑問があります。何が起こるでしょうか?私はこのケースでメモリリークを招いていますか? – SPandya

+0

@ SPandyaあなたは何を意味するのか分かりません。静的でない場合、 'FCCommunication ::'でアクセスすることはできません。 – Lundin

+0

私はクラスオブジェクトの使用を意味しました。FCObject-> MASTERと同様ですが、インスタンスに遭遇していません。 – SPandya

0

C++(クラスの)メンバー静的変数のように行われる前に、そのクラスのすべてのインスタンスに属し、彼らは、ARそのクラスのインスタンスが初期化される前に初期化されます。したがって、FCCo​​mmunications :: MASTERとFCObject-> MASTERの両方を使用して、これらの静的変数に違いなくアクセスすることができます。

注意すべき点は、静的変数を別々に定義する必要があることです。

bool FCCommunications::MASTER = false; 
0

静的メンバーは、初期化時にゼロに初期化されるメンバーです。 他の言葉では、それらは共通プールに属します。 他のオブジェクトがアクセスできます。 スコープはクラス内にあります ライフタイムはプログラムの有効期間です。

関連する問題