2016-07-22 55 views
5

如果我有一個像如何分配類中的靜態成員?

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

每次我實例連續三年intMyClass空間的物體被分配,什麼時候我有一些像

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

內存是如何分配的什麼類這次?

我在問,因爲我不完全知道如何分配內存時,我聲明同一類的多個實例,有沒有指向靜態成員也許?

回答

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; 

...有一個指針也許是靜態成員?

不可以。如果需要,您可以獲取靜態成員的指針,但不會爲每個實例分配一個指針。

靜態成員在應用程序啓動時被分配(並根據cpp文件中的初始化進行初始化),並且可以作爲其他「全局」對象訪問(儘管靜態不在全局名稱空間中,只有它的一個實例)。成員的可訪問性(即public,privateprotected)遵循正常規則。


要查看大小的效果,你可以使用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; 

因此,您的靜態成員將在您選擇的翻譯單元中的程序中的恰好一個位置進行分配。只要它只是一個翻譯單元的一部分,您可以將此分配放置到任何您想要的文件中。