2009-04-30 8 views
1

この質問はここでは些細なことだと思います。C++でのクラスの静的メンバー変数への問い合わせ

C++のコードでは、以下のようなものがあります:

class Foo 
{ 
public: 
    static int bands; 
    ... 
    ... 
private: 
    ... 
    ... 

}//class definition ends 

int Foo::bands; //Note: here its not initialized to any value! 
  1. はなぜ「バンド」が一度staticとしてクラス内で宣言されたときに再び必要以上のステートメントがありますか?

  2. また、静的変数を任意のクラスのプライベートメンバー変数として宣言できますか?

+0

。バンドを静的にすることを意味しましたか? – jalf

答えて

5

とを区別すると、となります。 bandsがクラス内で宣言されていますが、定義されていません。

非スタティックデータメンバーは、そのタイプのオブジェクトを定義するときに定義されますが、スタティックメンバーは特定のオブジェクトの一部ではないため、独自の定義が必要です。

2

a)これは、langugeが設計されている方法なので、必要です。

b)静的変数は、デフォルトのコンストラクタで初期化されます。組み込み型ではゼロに初期化されます。

c)はい、プライベート(通常はプライベート)でもかまいません。

0

は、それは彼らがどのように使用されるか、OBJファイルと関係があり、そしてどのようにグローバルためのメモリアドレスは、変数が最終的にリンクプロセスによって発見されているスコープthis question.

0

を見てみましょう。オブジェクトファイルには、対応するcppで定義されているすべてのグローバルデータと関数のアドレスが含まれています。彼らは相対的な方法でいくつかのメモリをレイアウトし、そのファイル内でこれらのグローバル変数/関数がどこにあるのかを知るように指示します。したがって、たとえば

これは、あなたがまっすぐCを前にしたことを考えるのは簡単です。純粋なC言語の世界では、より伝統的なモジュラプログラミングの意味でのことを行います。あなたのモジュールはヘッダとcppで定義されます。ヘッダーは、以下のような "パブリック"変数を定義し、externキーワードを使用して、それをcppでインスタンス化します。

がfoo.h

extern int bands; 

foo.cpp

#include "foo.h" 
int bands; 

foo.obj:

int bands can be found 0 bytes from the beginning of this file 

"のextern" キーワードこの名前が有効であることの状態とその対処しますリンク時に解決されます。 "foo.h"を含んでいて、 "bands"グローバル変数を使用したいと思った人は、今、それを使うことができました。リンク時に、リンカは、foo.objにバンドが存在していることがわかります。 foo.objに "int bands"を入れるのを忘れた場合は、リンカエラーが発生し、解決しなければなりません。

クラスの宣言で静的を使用するC++では同様です。あなたは、 "foo :: bands"と呼ばれるものが存在することをユーザに伝えており、リンクされた場所ではリンク時に解決されます。その後、リンカーはfoo.objのfoo :: bandsが存在することを確認し、foo :: bandsへのすべての参照を解決することができます。

0

Foo :: bandsを宣言する必要があるのは、クラスのインスタンスを作成する前に使用する予定があるということです。基本的に、C++クラスで静的宣言を行うと、そのクラスのすべてのインスタンスに対してその変数のコピーが1つだけ存在します。ただし、通常、クラスのインスタンスが宣言されるまで、Foo :: bandsにアクセスすることはできません。例えば

:それはそのような場合には必要ないです

Pointers to Members

#include <iostream> 
using namespace std; 

class X { 
public: 
    int a; 
    void f(int b) { 
    cout << "The value of b is "<< b << endl; 
    } 
}; 

int main() { 

    // declare pointer to data member 
    int X::*ptiptr = &X::a; 

    // declare a pointer to member function 
    void (X::* ptfptr) (int) = &X::f; 

    // create an object of class type X 
    X xobject; 

    // initialize data member 
    xobject.*ptiptr = 10; 

    cout << "The value of a is " << xobject.*ptiptr << endl; 

    // call member function 
    (xobject.*ptfptr) (20); 
} 
+1

あなたの理解は間違っています。クラスインスタンスが作成されていない場合でも、静的変数は存在します。 –

+0

申し訳ありませんが、私の意図は、変数が存在しないことを暗示することではなく、クラスのインスタンスが作成されるまで(例えば、データメンバーへのクラスポインタを介して)アクセスできないためですint Foo :: bandsを作るだけです。クラスのインスタンスを作成する前に変数にアクセスする予定がある場合は、宣言を宣言します。 –

関連する問題