我在這裏有點困惑。如果我們可以實例化一個類的對象並訪問成員方法,那麼爲什麼指向一個類?它有什麼好處嗎?我們什麼時候使用指向類的指針,什麼時候實例化它的一個對象?爲什麼我們需要一個指向類的指針,如果我們可以實例化它的一個對象並訪問類的成員?
謝謝。
我在這裏有點困惑。如果我們可以實例化一個類的對象並訪問成員方法,那麼爲什麼指向一個類?它有什麼好處嗎?我們什麼時候使用指向類的指針,什麼時候實例化它的一個對象?爲什麼我們需要一個指向類的指針,如果我們可以實例化它的一個對象並訪問類的成員?
謝謝。
您可能不需要指向某個類的指針。如果你的類很小,不會通過基類表現出多態行爲,或者花費任何東西來實例化,那麼你可能只需要即時刪除一個即可完成。
但在很多情況下,我們需要指針,因爲:
如果我們可以實例化一個類的對象並訪問成員方法,那麼爲什麼指向一個類?
如果您只有一個基類並且沒有派生類,那麼可以在堆棧上創建對象而不是指向該類的指針。在後者中,您應該在指針上調用delete
以返回由new
獲取的資源。 (還要確保堆從不溢出。如果您需要大量實例的數組,然後使用new
是唯一的選擇實例。)
class foo
{
int a ;
};
foo obj1 ;
foo obj2 = obj1 ; // Copy construction. Both obj2, obj1 have it's independent
// copy of objects. (Deep copy)
foo *obj3 = new foo ;
foo *obj4 = obj3 ; // Copy construction. However, both obj3, obj4 point to the
// same object. (Shallow copy)
// You should be careful in this case because deletion of obj3
// makes obj4 dangling and vice versa.
是否有任何好處?
Polymorphism,因爲它僅適用於指針/引用。
我們什麼時候使用指向類的指針,什麼時候實例化它的一個對象?
這取決於要求。如前所述,如果你只有一個基類創建堆棧上的對象是一個更好的選擇。
其中一個原因可能是性能。想象一下,你有一些類的100個實例。如果你沒有使用指針,並且你想做一些事情,比如將這些實例從一個容器複製到另一個容器,那麼會有相當多的開銷,因爲需要在每個容器上調用複製構造函數。但是,如果您有指向這些實例的指針,則唯一真正被複制的是指針,使得操作更加快速。
如果您需要複製對象,它們是否是指針並不重要,您仍然需要進行深度複製。但是,如果您需要轉讓所有權,這將適用,但如果您使用現代/即將推出的C++,則不適用,因爲移動語義將處理它。 – 2011-05-17 18:00:05
你問一個指針的用處一般嗎? – Tejs 2011-05-17 17:41:12
@Tejs,指向一個類的指針的用處。 – infinitloop 2011-05-17 17:44:22
可能重複[何時使用指針,什麼時候不使用?](http://stackoverflow.com/questions/397263/when-to-use-pointers-and-when-not-to) – 2011-05-17 17:51:34