您的兩個聲明都是具有自動存儲持續時間的對象的定義。也就是說,它們都將在函數結束時被銷燬。第一個是聲明Object
類型對象,第二個是Object*
類型對象。
剛剛發生的myObject2
的初始值爲新表達式。一個新的表達式動態分配一個對象並返回一個指向它的指針。 myObject2
正在使用指向動態分配的Object
的指針進行初始化。
因此,您正在見證創建對象的兩種不同方式。一個是可變定義,另一個是新表達式。
它沒有任何其他意義。想象一下,新表達式沒有返回指向對象的指針,而是直接引用該對象。然後,您可能會這樣寫:
Object myObject2 = new Object();
但是,C++默認使用值語義。這意味着動態分配的對象將被複制到myObject2
,然後你失去了它的跟蹤。您無法再獲取該對象的地址。 A 新表達式返回一個指針,以便您擁有動態分配的對象的句柄。
你可能會說:「好吧,我就是這麼寫的!但那是因爲Java以不同的方式工作。在Java中,myObject2
是您設置爲指向新的Object
對象的參考。它不會以任何方式複製對象。
C++並不要求您在動態分配對象時必須使用指針。事實上,你可以做這樣的事情(這是一種在Java當量):
Object& myObject2 = *(new Object());
但是,這是一個非常糟糕的主意。它突然掩蓋了對象被動態分配的事實,並且很容易犯一個錯誤並忘記銷燬對象(在Java中你不必關心)。至少有一個指針可能會提醒你這樣做。但是,即使這樣會導致錯誤或不清晰的代碼,這就是爲什麼建議您儘可能使用智能指針的原因。
簡而言之:這就是新表達式的行爲方式。它動態分配一個對象,然後返回一個指向它的指針。
指針不*需要*,只是記住的一種便捷方式,其中對象是。只用'new Object'也會在堆上創建一個對象,但是我們不知道它在哪裏。 –