2013-05-01 100 views
0

在所有我的課的教授們使用這種技術來創建一個項目,一個指針它被傳來傳去強調:最初是否可以創建C++指針而不是創建變量,然後爲其指定一個指針?

更新只是一個錯誤,同時打字。太習慣於java。

Item item; 
Item* pItem = &item; 

現在你可以放心地圍繞項目使用pItem沒有在內存中複製項目通過。但是,如果我只是做到以下幾點:

Item* item = new Item; 

然後,我有一個指針,我可以取消引用主或你有什麼,那我可以簡單地繞過作爲一個變量,是一個點相信它不會被重複。

是不是有什麼毛病創建指針我創建了一個新的對象?

此外,我在Java中花了一段時間回到C++花費我的暑期ALLEGRO5,所以有人可以清楚地解釋在CPP中創建一個新對象的不同方法,以及每種方法實際上做了什麼?

請問:

Item item; 

實際上使一個新的項目對象,或像Java是它只是一個空引用?

+0

你的方式沒有錯。事實上,第一段代碼是無用的。 – 2013-05-01 04:50:36

+6

您的問題中的第一行代碼「Item item = new Item;」無效。這使得很難回答你的問題,因爲你顯示的兩個片段可能會有不同的行爲,這取決於第一個片段被糾正的方式。 – 2013-05-01 04:51:09

+0

你在問題標題中提出一件事,在它的身上另一件事。另外,你應該澄清你是否確實是指'Item item = new Item;'或不。這在一般情況下不起作用。 – juanchopanza 2013-05-01 06:11:40

回答

4

呃,這也不行,因爲new Item返回Item*

Item item = new Item; 

這是標準做法實踐堆分配(即通過delete發佈)對象:

Item* item = new Item; 

我認爲你的教授居然說:

Item item; 
Item* pItem = &item; 

這是標準做法堆棧分配(即留下它的範圍)的對象釋放。

3

在創建新對象時創建指針有什麼問題嗎?

沒有什麼不對。但你應該考慮以下幾點:

  • 你真的需要一個動態分配的對象來開始嗎?
  • 如何所有權的語義,也許智能指針可以爲您服務比原始指針更好。

Item item; 

創建新的對象。而這個對象的生命週期取決於在創建它的範圍,
如果全球範圍內創建該對象,它生活在整個程序的生命週期。
如果是本地創建的,它生活在其中創建它的範圍內{ }

1

如果您正在尋找一種方法來傳遞一個項目而不復制它的內存(或者在複製構造函數中做更重的事情),那麼您可能會考慮引用而不是原始指針。

的引用沒有指針(即它們不能成爲NULL,或指向創建後不同的對象)的所有靈活性,但它們在對象所有權和生命週期方面更清潔(有參考你將永遠不會擁有的,也不是負責釋放對象;用const引用臨時值可能會獲得所有權,但僅此而已)。

與原始指針不同,您可以考慮智能指針,但它們會引入額外的成本,與引用不同。

相關問題