2016-07-22 3 views
5

私が持っている場合はクラス内の静的メンバーはどのように割り当てられていますか?

class MyClass { 
    public: 
     int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

私はメモリが割り当てられているどのように

class MyClass { 
    public: 
     static int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

のようなものを持っている場合について、私は三つの連続intためMyClassスペースのオブジェクトが割り当てられているインスタンス化するたびに、のようなクラス今回?

同じクラスの複数のインスタンスを宣言したときにメモリがどのように割り当てられるのかが完全にはわからないため、静的なメンバーへのポインタがありますか?

答えて

4

既に述べたように、静的メンバー変数のためのスペースをクラス定義の外に明示的に割り当てる必要があります。

あなたの他の質問に答えて、静的メンバー変数はクラスオブジェクトに関連付けられていません。つまり、MyClassオブジェクトが存在しなくなってから(プログラムが終了するまで)、クラスのすべてのインスタンスで共有されます。

は、あなたがそうのようなMyClassのクラスの複数のインスタンスを作成したと言う:

class MyClass { 
public: 
    static int myMember1; 
    int myMember2; 
    int myMember3; 
}; 

int MyClass::myMember1 = 1; 

int main() 
{ 
    MyClass mc1; 
    MyClass mc2; 

    mc2.myMember1 = 2; 

    std::cout << mc1.myMember1 << '\n'; 
    std::cout << mc2.myMember1 << '\n'; 
    return 0; 
} 

出力は次のようになります。

2 
2 
+2

それはおそらく 'mc1.myMember1'は合法ですが、それはだことを指摘する価値があります貧しいスタイル。通常は、値が特定のインスタンスに関連付けられていないことを明確にするために、MyClass :: myMember1と記述します。 –

1

静的membesは、あなたがグローバル変数としてこれらのメンバーに思うが、(パブリック、あなたの場合には、対応するアクセス権を持つ)クラスのスコープ内で宣言できスタティックメモリに

を割り当てられています。

3

この時点で[静的メンバーを使用して]メモリがどのように割り当てられていますか?

オブジェクトの各インスタンスは、中2つの整数を持つことになりますし、すべてのインスタンスがstatic整数へのアクセス権を持っている(が、それを「所有」していない) - それはインスタンスの一部ではない、それがスコープ内にありますクラスの

N.B.メンバはクラス内で宣言されていますが、クラス外(cppファイル内)で定義する必要があります。

int MyClass::myMember1 = 42; 

...多分静的メンバへのポインタはありますか?

いいえ必要に応じて静的メンバーへのポインタを取得できますが、1つは各インスタンスに割り当てられません。

静的メンバーは、アプリケーションが起動され、他の「グローバル」オブジェクトがアクセスされるときに割り当てられます(cppファイルの初期化に従って初期化されます)(静的がグローバル名前空間にない場合でも、 1つのインスタンスのみ)。メンバーのアクセス可能性(すなわち、public,対protected)は、通常のルールに従います。


サイズに影響を見るには、sizeof()を使用できます。

class MyClass { 
    public: 
     int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

class MyClass1 { 
    public: 
     static int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

int MyClass1::myMember1 = 42; 

int main(int argc, char* argv[]) 
{ 
    using namespace std; 
    cout << sizeof(MyClass) << " " << sizeof(MyClass1) << endl; 
} 

(アライメント及びintのサイズに応じて)上記、12 8の出力を生成することができます。

Demo

2

はまた、クラスの外の変数を定義する必要があります。これが実際の割り当てが行われる場所です。

本質的にはグローバル変数と同じです。

class Test 
{ 
    public: 

    static int too; // Just a declaration 
}; 

int Test::too; // Actual allocation, every instance will use this 
2

その静的メンバーのメモリをどこかに明示的に割り当てる必要があります。

例えば、それはヘッダファイルの中で、あなたのクラス:

// myclass.h 
class MyClass { 
    public: 
     static int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

そして、あなたが明示的に静的メンバのためのスペースを割り当て、そのクラスのためのcppファイルを持っているが、それはまた、それを初期化することができます:

// myclass.cpp 
int MyClass::myMember1 = 5; 

あなたの静的メンバーは、あなたが選択した翻訳単位で、プログラム内の正確に1か所に割り当てられます。この割り当ては、1つの翻訳単位の一部である限り、任意のファイルに配置できます。

関連する問題