2011-06-08 130 views
0

以下兩種創建對象的方法有什麼區別?對象創建差異

Test* t = new Test(); 

Test* t; 

你的回答第二個樣本匹配什麼,我認爲這會做(沒有創建對象),但

class Test { 
     public: 
       void bla(void) { 
         std::cout << "test" << std::endl; 
       }; 
}; 

int main(void) { 
     Test* test; 
     test->bla(); 
} 

給我輸出的「測試」。 ..所以,實際上有一個對象

+0

我修復了你的格式。第一次編輯的免費;-) – Johnsyweb 2011-06-08 11:41:58

+0

你確定你不是指第二個片段中的'Test t'? – 2011-06-08 11:49:31

+2

你的意思是創建一個對象和不創建對象之間的區別? – 2011-06-08 12:16:47

回答

4

第二個完全不創造任何對象,並試圖對其進行訪問將導致壞事™。

+0

多數民衆贊成多多少少我認爲 – yogi 2011-06-08 12:04:14

7

第一個做4兩件事:

第二個剛剛創建的指針Test。並沒有初始化。


@yogi - 爲您的編輯 - 這是完全未定義行爲,當指針未初始化。不,它是而不是的一個對象。有關更多信息,請參閱C++ function called without object initialization

+0

+1,你還可以補充說,它在第一種情況下,它的價值初始化使用'()'後'測試'。 – iammilind 2011-06-08 11:55:35

+0

@iammilind - 是的,當然,謝謝!我錯過了括號(: – 2011-06-08 12:14:58

1

第一個是創建對象實例的方法。

第二個不是創建對象實例的方法。它只是聲明一個指針,它仍然未初始化。

2

這是一個指針,分配在堆棧上,並使用32或64位內存。

Test * t; 

這將在堆上創建類型測試的對象(你需要desalocate吧)

t = new Test(); 

這將在棧上創建類型測試的對象(無需desalocate它它會在您退出當前上下文儘快disapear)

Test t2; 

編輯

你的例子的工作原理是因爲編譯器優化了你的代碼:它注意到你不使用任何成員,所以它可能不會使你尋找實例的努力。

1

更新之後:它仍然成功調用bla()的原因只是未定義的行爲。因爲這正是C++標準定義了使用不安全內存時發生的情況(在這種情況下,指針所指向的任意地址) - 行爲是未定義的。

0
Test* test;   
test->bla(); 

正如其他答案所述,Test* test不會產生任何對象。這是一個未初始化的指針,指向Test。除非它被初始化爲指向有效的對象Test,否則它不會指向任何有效的內容。

取消引用像您這樣的未初始化指針是未定義的行爲
在你的情況下,它不會崩潰,因爲你不是指this裏面bla()
儘管如此,它仍然是未定義的行爲來解引用單元化的test

重申以上幾點,下面的例子大多會崩潰。

#include<iostream> 
class Test 
{ 
    public: 
     int i; 
     void bla(void) 
     { 
      std::cout << "test" << std::endl; 
      std::cout << "test->i" << this->i <<std::endl; 
     } 
}; 

int main(void) 
{ 
    Test* test; 
    test->bla(); 
    return 0; 
} 
0

正如其他人已經說過,你只是幸運,你觸發未定義行爲恰好是什麼樣子,你以爲你想要的(主要是因爲你的Test :: bla(下)幾乎就像是一個全球性的免費功能)。要查看你的榜樣和好如初,只是添加了一些不平凡的類成員:

class Test { 
public: 
    void bla(void) { 
    std::cout << "test: " << x << std::endl; 
    }; 
    int x; 
}; 

你可以把你原來的例子,作爲一個免費的功能

void bla(Test * p) { std::cout << "test" << std::endl; } 

你恰好有一個叫垃圾參數,但由於您不使用參數,所以沒有什麼不好的事情發生。在我修改的例子中,我們嘗試訪問p->x並死亡。