class : foo
{
public:
static const foo Invalidfoo;
foo();
foo(int, string);
private:
int number;
std::string name;
};
它是安全的或容易出現什麼問題?
編輯:
我想用這個有一個無效的對象返回爲發動錯誤的引用。
class : foo
{
public:
static const foo Invalidfoo;
foo();
foo(int, string);
private:
int number;
std::string name;
};
它是安全的或容易出現什麼問題?
編輯:
我想用這個有一個無效的對象返回爲發動錯誤的引用。
這是完全合法的,但下面是更好:
class foo:
{
public:
static const& foo Invalidfoo()
{
static foo Invalidfoo_;
return Invalidfoo_;
}
private:
foo();
};
這樣保證了初始化對象是首次使用這種方式。
編輯:但不管你怎麼做,你仍然有一個全局對象,這可能是一個問題的原因。最好的解決方案可能是每次需要默認構造對象時調用默認構造函數。在效率方面,差別可能是可以忽略的。
它只是表現得像一個全局變量或單身。這很容易出現與這些問題有關的問題。
這是完全有效的代碼。它沒有任何理由導致任何問題,因爲靜態數據成員不會影響類的大小。無論你在一個類中定義多少個靜態數據成員,它的大小都不會改變一個字節!
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支撐,
靜態數據成員不的一部分 一類的子對象。有是 只有一個副本 類的所有對象共享的靜態數據成員 。
您不能定義封裝類類型的非靜態數據成員,因爲非靜態成員是對象的部分,這樣他們就有助於類的大小。由於數據成員的遞歸性質,它在計算類的大小時會導致問題。
請參見本主題:
這是合法的。從實用/風格的角度來看,代碼很糟糕,但它是合法的,在技術上它可以工作。比Singleton更好,因爲它是不可變的。
這實際上是如何實現一個單例,除了你的靜態成員將是一個指針。所以是的,你很安全。