這是允許的嗎? :匿名對象可以在C++中聲明爲靜態嗎?
class A;
void foo()
{
static A();
}
我得到的信號11,當我嘗試做,但以下工作正常:
class A;
void foo()
{
static A a;
}
謝謝。
這是允許的嗎? :匿名對象可以在C++中聲明爲靜態嗎?
class A;
void foo()
{
static A();
}
我得到的信號11,當我嘗試做,但以下工作正常:
class A;
void foo()
{
static A a;
}
謝謝。
沒有。在C++中沒有這樣的「匿名對象」。定義一個類型爲A的對象會立即被丟棄;你寫的是一個表達式,它返回一個永遠不會分配給變量的A對象,就像printf的返回碼通常不會被分配或使用一樣。
在那段代碼中,如果它有效,你會聲明「no object」被分配到堆外部。由於沒有分配對象,所以沒有意義。
您可以創建一個「匿名」自動變量,但不是一個靜態變量。以下將創建類A的對象並調用構造函數,然後在函數出口調用析構函數。
class A;
void foo()
{
A();
}
你可以通過在預先分配的位置在堆上分配或constructing it in place對象得到類似的效果。
void foo()
{
new A();
}
void foo()
{
static char memory[sizeof (A)];
new (memory) A();
}
但是,在這兩種情況下,都無法正確清理對象,因爲指針未被保留以供以後的刪除調用使用。即使靜態內存將被釋放,析構函數也不會被調用。匿名對象只有在與垃圾收集器一起使用時才真正使用。
不知何故,我認爲這個人的單身構造函數的副作用後。
無論如何,只是給了事物一個變量名已經。
當然還有匿名的C++對象! A(100) is anonymous object在此示例中
但是,如果您考慮一下,則創建靜態匿名對象是沒有意義的。
這就是爲什麼我發現自己在看這個問題(7年後)。我想創建一個具有全局作用域的對象,但我不希望它有一個名稱。它在其構造函數中註冊了一些其他對象,所以它不需要名稱。 – 2015-05-17 18:48:54