Yahoo奇摩知識+ 將於 2021 年 5 月 4 日 (美國東部時間) 終止服務。自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+ 網站將會轉為唯讀模式。其他 Yahoo奇摩產品與服務或您的 Yahoo奇摩帳號都不會受影響。如需關於 Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。

NG
Lv 7
NG 發問時間: 電腦與網際網路程式設計 · 10 年前

C++ class 內的靜態變數

class shared {

static int a;

int b;

public:

void set(int i, int j) { a=i;b=j;}

};

Notice that the integer a is declared both inside shared and outside of it.

As mentioned earlier, this is necessary because the declaration of a inside shared does not allocate storage.

紅色的那一句話 我不太懂

我只知道!! a變數 似乎 佔據整個class

不管我在main 設置多少的 class 每個class 內的變數 a 都是一樣的

甚至不管改變哪個class 的 a變數 其他class 的a變數也跟著改變!!

已更新項目:

謝謝 你們的回答 與 意見 稍微有些了解!!

3 個解答

評分
  • 其威
    Lv 7
    10 年前
    最佳解答

    他的意思是說,在宣告 class static 變數的時候,編譯器不會幫你配置記憶體。

    你必須在外面寫:

    int shared::a;

    這樣才會配置記憶體空間給它。

    這麼作是有原因的,因為寫 C++ 的時候可以分成多個檔案獨立編譯、最後才將所有目的檔連結起來變成執行檔。

    如果他在看到 class 的宣告的時候就配置空間給 static 變數,會變成有很多該變數的副本,與期望不符。

    所以,你必須明確告知編譯器說「在這裡幫我配置這變數」。

    舉例來說,假設今天你有四個檔案:

    - main.cpp(主程式,裡面 include shared.h)

    - module1.cpp(實做某個其他的功能,也有 include shared.h)

    - shared.cpp(實做 shared 的各函式,當然也有 include shared.h)

    - shared.h(shared 的宣告)

    你的編譯工具通常會獨立編譯這三個 .cpp 檔案,然後最後才統統連結在一起。

    如果編譯器看到 .h 裡面有 class static 變數就自己幫你配置了空間,會導致 main.cpp、module1.cpp、shared.cpp 裡面都各自有一份 shared::a。

    所以,編譯器不會自己幫你配置,你必須在這幾個 .cpp 裡的某一個(通常是 shared.cpp)中寫:

    int shared::a = 1234;

    之類的。

    === 分隔線 ===

    你設置多少個 class 就會有多少個 a:

    class shared {

    static int a;

    };

    class shared2 {

    static int a;

    };

    這麼一來會有 shared::a 與 shared2::a 兩個不同的 a,在你改 shared2::a 的時候,shared::a 並不會跟著變。

    但是對每一個 shared(或 shared2)的實體來說,在 member function 中會存取到同一個 shared::a(或 shared2::a)。

  • 匿名使用者
    7 年前

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

    【 最新活動→迎接新會員,首存狂送20% 】

    【運動→電子→對戰→現場→彩球 】

    【免費服務 →電影區、討論區、KTV歡唱、運動轉播、即時比分、24H客服 】

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

  • 10 年前

    他的意思是說,你整份 class,假使有500 個物件,像是

    shared obj1;

    shared obj2;

    ..

    shared obj500;

    這 500 個物件所使用的變數 a 是同一份,即在記憶體裡面只有一個 a (但 b 的話,不同物件就會有不同的 b,所有 b 有 500 份)。

還有問題?馬上發問,尋求解答。