2011-05-17 49 views
3


我在這裏有點困惑。如果我們可以實例化一個類的對象並訪問成員方法,那麼爲什麼指向一個類?它有什麼好處嗎?我們什麼時候使用指向類的指針,什麼時候實例化它的一個對象?爲什麼我們需要一個指向類的指針,如果我們可以實例化它的一個對象並訪問類的成員?

謝謝。

+0

你問一個指針的用處一般嗎? – Tejs 2011-05-17 17:41:12

+0

@Tejs,指向一個類的指針的用處。 – infinitloop 2011-05-17 17:44:22

+0

可能重複[何時使用指針,什麼時候不使用?](http://stackoverflow.com/questions/397263/when-to-use-pointers-and-when-not-to) – 2011-05-17 17:51:34

回答

9

您可能不需要指向某個類的指針。如果你的類很小,不會通過基類表現出多態行爲,或者花費任何東西來實例化,那麼你可能只需要即時刪除一個即可完成。

但在很多情況下,我們需要指針,因爲:

  1. 類是「大」,如,是昂貴的實例或使拷貝。在這種情況下,我們可以傳遞指針,而不是根據需要創建它們,以便在RAM和CPU上更高效。
  2. 你可能不希望有一個以上的類的實例。考慮一個記錄器,通常以Singleton的形式實現。現在,單身人士在許多方面都是「不好的」,但這種用法表明,有時候實例化某些班級的第二個副本可能會破壞某些東西。所以你需要一個指針(或引用)到唯一的副本。
  3. 當你想要運行時polymorphic行爲,你幾乎肯定需要一個指針(或者,最好是一個引用)。
7

如果我們可以實例化一個類的對象並訪問成員方法,那麼爲什麼指向一個類?

如果您只有一個基類並且沒有派生類,那麼可以在堆棧上創建對象而不是指向該類的指針。在後者中,您應該在指針上調用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,因爲它僅適用於指針/引用。

我們什麼時候使用指向類的指針,什麼時候實例化它的一個對象?

這取決於要求。如前所述,如果你只有一個基類創建堆棧上的對象是一個更好的選擇。

1

其中一個原因可能是性能。想象一下,你有一些類的100個實例。如果你沒有使用指針,並且你想做一些事情,比如將這些實例從一個容器複製到另一個容器,那麼會有相當多的開銷,因爲需要在每個容器上調用複製構造函數。但是,如果您有指向這些實例的指針,則唯一真正被複制的是指針,使得操作更加快速。

+1

如果您需要複製對象,它們是否是指針並不重要,您仍然需要進行深度複製。但是,如果您需要轉讓所有權,這將適用,但如果您使用現代/即將推出的C++,則不適用,因爲移動語義將處理它。 – 2011-05-17 18:00:05

相關問題