簡體   English   中英

如果我們可以實例化一個對象並訪問該類的成員,為什么我們需要一個指向類的指針?

[英]Why do we need a pointer to a class if we can instantiate an object of it and access members of the class?


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

謝謝。

您可能不需要指向類的指針。 如果你的類很小,沒有通過基類表現出多態行為,或者需要花費任何實例化的東西,你可能只需要動態地刪除一個並完成。

但在許多情況下,我們需要指針,因為:

  1. 這個類“很大”,因為實例化或復制是很昂貴的。 在這種情況下,我們可以傳遞指針而不是僅僅根據需要創建指針,以便更有效地使用RAM和CPU。
  2. 您可能不希望那里有多個類的實例。 考慮一個記錄器,它通常被實現為Singleton 根據許多人的說法,單身人士現在是“壞人”,但這種用法說明了有時候實例化某個類的第二個副本可能會破壞某些東西。 因此,您需要一個指向唯一副本的指針(或引用)。
  3. 當你想要運行時多態行為時,你幾乎肯定需要一個指針(或者,最好是一個引用)。

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

如果你只有一個基類而沒有派生類,那么最好在堆棧上創建對象而不是指向類的指針。 在后者中,您應該在指針上調用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.

它有什么好處嗎?

多態性因為它僅適用於指針/引用。

我們何時使用指向類的指針,何時實例化它的對象?

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

一個原因可能是表現。 想象一下,你有一些類的100個實例。 如果你沒有使用指針而你想要做一些事情,比如將這些實例從一個容器復制到另一個容器,那么由於需要在每個容器上調用復制構造函數,所以會產生相當大的開銷。 但是,如果你有指向那些實例的指針,那么唯一真正被復制的是指針使操作更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM