2011-06-15 66 views

回答

3

這是完全合法的,但下面是更好:

class foo: 
{ 
public: 
    static const& foo Invalidfoo() 
    { 
     static foo Invalidfoo_; 
     return Invalidfoo_; 
    } 

private: 
     foo(); 
}; 

這樣保證了初始化對象是首次使用這種方式。

編輯:但不管你怎麼做,你仍然有一個全局對象,這可能是一個問題的原因。最好的解決方案可能是每次需要默認構造對象時調用默認構造函數。在效率方面,差別可能是可以忽略的。

1

它只是表現得像一個全局變量或單身。這很容易出現與這些問題有關的問題。

1

這是完全有效的代碼。它沒有任何理由導致任何問題,因爲靜態數據成員不會影響類的大小。無論你在一個類中定義多少個靜態數據成員,它的大小都不會改變一個字節!

struct A 
{ 
    int i; 
    char c; 
}; 

struct B 
{ 
    int i; 
    char c; 
    static A a; 
    static B b; 
}; 

在上面的代碼中,sizeof(A) == sizeof(B)將始終爲真。看到這個演示:

其從C++標準(2003年)由部分$ 9.4.2/1支撐,

靜態數據成員不的一部分 一類的子對象。有只有一個副本 類的所有對象共享的靜態數據成員 。

您不能定義封裝類類型的非靜態數據成員,因爲非靜態成員是對象的部分,這樣他們就有助於類的大小。由於數據成員的遞歸性質,它在計算類的大小時會導致問題。


請參見本主題:

0

這是合法的。從實用/風格的角度來看,代碼很糟糕,但它是合法的,在技術上它可以工作。比Singleton更好,因爲它是不可變的。

0

這實際上是如何實現一個單例,除了你的靜態成員將是一個指針。所以是的,你很安全。