2012-12-13 29 views
0
#include "B.h" 

class A 
{ 
    public : 
     A() 
     { 
      s_b = new B(); 
      b = new B(); 
     } 

     static B *s_b; 

     B *b; 
}; 



#include<iostream> 

using namespace std; 

#include "A.h" 

int main() 
{ 
    cout<<"hello"; 
} 

在我的項目中,我看到了上面的靜態對象。但是無法知道它的確切用途以及它們與一般對象的區別。 請幫我找出我可以用s_b做什麼,而不是由b完成。靜態對象在一個類中的重要性以及它們與一般對象的不同

+2

你的代碼甚至沒有編譯。 – Gorpik

+0

你不需要'新'。 –

+0

@Gorpik:這只是一個僞代碼。 – Kenta

回答

3

其中之一,s_b不會爲創建的每個A實例佔用內存,而b會佔用內存。 sizeof(A)增加b,但不增加s_b

A static在該類的所有實例之間共享,因此它的行爲類似於全局。你不需要一個對象來訪問它,你可以直接使用A::s_b

2

靜態成員與名稱空間作用域中定義的對象或函數之間唯一真正的區別是訪問。例如,靜態數據成員可以是私有的,在這種情況下,它不能在類之外訪問;並且靜態函數成員可以訪問私有數據成員,而名稱空間範圍內的某個函數不能這樣做。

訪問語法也不同:如果在課程之外,則必須使用ClassName::memberName(或classInstance.memberName)來訪問該成員。沒有using,否則可以訪問它。

1

一般來說,如果不使用C++ 11,靜態成員必須在類的聲明之外進行初始化,除了常量int類型。

所以你上面貼的代碼是有缺陷的。你需要一個像

A::s_b = B(); 

以外的類A {...};在非靜態構造函數中初始化靜態成員是錯誤的,因爲構造函數用於構造對象,但靜態成員 不屬於該對象,但屬於該類。所以這些靜態成員不能通過靜態成員函數進行修改。

將「class」視爲「人」,將該「class」的對象視爲特定的人,如「John Smith」。所以如果你有一個領域,「薪水」。這應該是一個非靜態的領域,因爲每個人都有不同的薪水。但是如果你有字段「total_population」,它應該是一個靜態成員,因爲這個字段在語義上不屬於一個特定的人,而是屬於整個「人」。

+0

我知道了。我必須在cpp文件中如下初始化s_bl B * A :: s_b = NULL; 你能解釋一下這個靜態對象需要什麼嗎? – Kenta

+1

你寫了A班,我們沒有。我們怎麼知道它的用途? A的每個實例都有自己的b。但是他們都擁有相同的s_b。 – TheMathemagician

+0

可以在析構函數中刪除這個靜態對象嗎? ,因爲許多對象可能共享這個靜態對象,但靜態對象將共享一個公共內存。所以當調用drestructor很多時候靜態對象會被多次刪除,這會導致斷言錯誤。如果我錯了,請讓我正確。 – Kenta

相關問題