2012-06-03 103 views
5

假設我們有一個類,靜態成員對象

class Egg 
{ 
static Egg e; 
int i; 
Egg(int ii):i(ii) {} 
Egg(const Egg &); //Prevents copy-constructor to be called 
public: 
static Egg* instance() {return &e} 
}; 

Egg Egg::e(47); 

此代碼可以保證,我們不能創造任何對象,但可以只使用靜態對象。但是我們怎麼能在類中聲明同一個類的靜態對象。

還有一點,因爲e是一個靜態對象,靜態對象只能調用靜態成員函數,所以如何在這裏爲靜態對象e調用構造函數,而且它的構造函數是私有的。

回答

6

但是我們怎樣才能在類中聲明同一個類的靜態對象。

A static成員變量不存儲在類的每個對象中。因此,如果您在類中聲明static成員變量,或者在定義類後聲明瞭名稱空間級別對象,則僅在訪問(Class::varvar)和訪問protectedprivate成員方面有所不同。

而且還一件事,因爲e更是一個靜態對象,靜態對象只能調用靜態成員函數

我認爲你是混合static功能和static對象。在static功能中,您只能調用static函數(除非您在對象上調用它們)。

怎麼可能在構造函數在這裏呼籲靜態對象e

像所有其他對象的構造已被調用static對象了。

也是它的構造函數是私有

訪問控制是在C級水平++檢查。因此,由於static對象在類中,因此它可以訪問private成員。

不像在其它一些語言中,下面是在C++中的法律,由於進入私人構件是從裏面的類 - 即使上(在這種情況下other)另一個目的:

class Test { 
private: 
     int i; 
public: 
     Test(const Test &other) 
     : i(other.i) 
     {} 
}; 
+0

靜態對象的類內,但它如何可以訪問私有的構造。 如果對象的構造函數是私有的,通常不能創建對象。 – Luv

+1

它可以訪問構造函數,因爲它是在類中定義的。班級內的所有內容都可以訪問私人成員。 –

2

但是我們怎麼能在類中聲明同一個類的靜態對象。

通常情況下你需要一個正向基準,但由於雞蛋e是靜態的,它實際上定義外的類定義的。如果e不是靜態的,你會得到一個錯誤(類似於「字段Egg e具有不完整類型」)。

另外還有一點,因爲e是一個靜態對象,靜態對象只能調用靜態成員函數,所以如何在這裏爲靜態對象e調用構造函數。

這是不完全正確。一個類中的靜態成員函數只能訪問靜態成員數據。 靜態蛋è實例蛋,所以它可以訪問所有成員和數據定期雞蛋即可。

也是它的構造函數是私有的。

任何私有成員可以從類內使用。由於靜態蛋e被宣佈爲蛋的成員,它可以使用私有構造函數。 e的定義是以外的類,因爲它是靜態的,但它仍然是類成員。

並且最後你的代碼不編譯,因爲你離開這裏了一個分號:

static Egg* instance() {return &e;}