2010-02-18 58 views
5

與克好奇東西++在棧上分配(也許還與其他編譯器):C++作用好奇

struct Object { 
     Object() { std::cout << "hey "; } 
     ~Object() { std::cout << "hoy!" << std::endl; } 
}; 

int main(int argc, char* argv[]) 
{ 
     { 
       Object myObjectOnTheStack(); 
     } 
     std::cout << "===========" << std::endl; 
     { 
       Object(); 
     } 
     std::cout << "===========" << std::endl; 
     { 
       Object* object = new Object(); 
       delete object; 
     } 
} 

Compied與克++:

=========== 
hey hoy! 
=========== 
hey hoy! 

第一種類型的分配的不構造對象。我錯過了什麼?

回答

12

第一種構造實際上並沒有構造這個對象。爲了創建使用默認構造函數棧上的對象,則必須省略()

Object myObjectOnTheStack; 

您定義當前的風格,而不是聲明瞭一個名爲myObjectOnTheStack函數返回一個Object

+0

嘗試'對象myObjectOnTheStack;'即不帶'()' – Justicle 2010-02-18 23:28:57

+0

@Jerry,感謝我糾正的術語 – JaredPar 2010-02-18 23:31:15

+4

... 「而不是* *聲明的函數」 ... – Potatoswatter 2010-02-18 23:34:18

4

「最煩人的解析」的又一個例子。您沒有定義對象,而是聲明瞭一個名爲myObjectOnTheStack的函數,它不接受任何參數並返回Object

2
Object myObjectOnTheStack(); 

是一個功能myObjectOnTheStack採取任何參數,並返回一個Object的正向聲明。

你想要的是

Object myObjectOnTheStack;