2009-04-30 63 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. 爲什麼需要再次上面的語句時,「帶」類靜態內部一次申報?

  2. 也可以將一個靜態變量聲明爲任何類中的私有成員變量?

+0

這不是在這種情況下需要。你是否想讓樂隊變得靜止? – jalf 2009-04-30 13:23:47

回答

5

C++注意到聲明之間的區別定義爲bands在類中聲明,但未定義。

當您定義該類型的對象時,將定義一個非靜態數據成員,但由於靜態成員不是任何特定對象的一部分,因此它需要它自己的定義。

2

a)它是必需的,因爲這是languge的設計方式。 b)靜態變量由其默認構造函數初始化,或者爲內置類型初始化爲零。

c)是的,他們可以(通常是)私人的。

0

它與OBJ文件,它們是如何用來做什麼,和內存如何在全球範圍的地址變量是通過連接過程最終發現。目標文件包含在相應cpp中定義的所有全局數據和函數的地址。他們以相對的方式佈置一些內存,告訴liker在這個文件中可以找到這些全局變量/ funcs的位置。因此,例如,

function doFoo can be found 0 bytes from beginning of this file 
int foo::bands can be found 12 bytes from beginning of this file 
etc 

如果你之前做過直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 

的 「外部」 關鍵字狀態,這個名字是有效的,其地址會在鏈接時解決。每個包含「foo.h」並想使用「band」全局變量的人都可以使用它。在鏈接時,鏈接器會找出foo.obj中存在的頻段。如果你忘記在foo.obj中加入「int bands」,你會得到一個鏈接器錯誤,並且必須去解決它。

在C++中使用靜態類聲明我相似。你告訴用戶存在這個叫做「foo :: bands」的東西,它的存在將在鏈接時解決。後來下了線,鏈接器發現,在foo.obj,FOO ::帶存在,所有引用到foo ::帶就可以解決。

0

我的理解是,你只需要,如果你打算使用它之前就已經創建類的實例來聲明美孚::帶。基本上,當你在一個C++類中聲明一個靜態的時候,那個類的所有實例只存在該變量的一個副本。但是,在聲明類的實例之前,您通常無法訪問Foo :: band。

例如:

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

你的理解是錯誤的。即使沒有創建類實例,該靜態變量也會存在。 – 2009-04-30 13:53:33