簡體   English   中英

哪種是在C ++中實例化對象的正確方法?

[英]Which is the right way to instantiate objects in C++?

在C ++中(我使用QT)我可以用兩種方式創建QString類的實例:

方法1

QString str = "my string";

方法2

QString *str = new QString("my string");

我知道這與指針有關。 所以我的問題是:

  1. 兩者有什么區別?
  2. 我應該堅持哪種方法?
  3. 什么時候使用方法1是正確的,什么時候使用方法2是正確的?
  4. 在方法2中,我可以通過調用delete str;來銷毀對象delete str; 使用方法1時如何刪除str變量?

謝謝

  1. 主要是他們有不同的生命周期:方法2中創建的對象將任意長,直到你調用刪除; 在方法1中,它將在堆棧上創建,並在從函數調用返回時被銷毀(如果有的話)。 其次,方法2需要更多的工作,因為非平凡的內存管理。

  2. 使用匹配您想要的生命周期的方法。 如果方法1的生命周期足夠好,則不要使用方法2,因為它需要內存管理的開銷。 如果您可以重構您的程序,以便您可以使用方法1同時改進設計,那將更加高效和優雅。

  3. 見上文。 特別是,使用方法1並存儲指向對象的指針並在其生命周期之后訪問它是一個陷阱。 這也可以通過方法2實現,但顯式破壞會將程序員的注意力集中在它上面(但仍然因為生命周期並不簡單,這可能是一個陷阱)方法2的一個缺陷是忘記刪除它導致內存泄漏(或刪除它)太早,並且如本段前面所述提到它)

  4. 在方法1中,當函數返回時,將自動刪除該對象。

這兩者是非常不同的東西。

QString str("my string"); 創建一個自動管理其生命周期的對象:對象要么存在於其封閉范圍的末尾(如果它是局部變量),要么存在於程序的末尾(如果它是全局變量)。

new QString("my string"); 創建具有手動管理生命周期的對象,也稱為“動態對象”(並返回指向此對象的指針)。 這意味着負責管理對象的生命周期。 除非您正在編寫庫組件,否則這幾乎不是正確的事情

這就是C ++哲學的核心:C ++是一種用於庫編寫的語言。 您可以使用工具編寫高質量,可重復使用的組件。 如果您這樣做,您將需要了解終身管理的復雜性。 但是,在此之前 ,您應該使用現有的庫組件。 這樣做時,您會發現幾乎不需要執行任何手動管理。

使用動態容器(向量,字符串,映射等)來存儲數據並構建自己的數據結構。 如果需要修改調用者范圍內的對象,則通過引用傳遞參數。 從更簡單的組件構建復雜的類。 如果您確實必須擁有動態對象,請通過unique_ptr<T>shared_ptr<T>處理程序類來處理它們。

不要使用指針。 很少使用newdelete永遠。

(進一步的提示:1)除非是ADL,否則永遠不要使用using namespace 2)除非你正在編寫庫組件,否則精心設計的類不應該有析構函數,復制構造函數或賦值運算符。 如果他們這樣做,將違規邏輯分解為單一責任庫組件,然后參見2)。)

使用第一種語法時,您將創建名稱為str對象,其類型為QString ,初始值為"my string"

在第二個聲明中,您將創建名稱為str QString類型的指針。

指針不保持值,它們指向存儲值的存儲位置,差異很大。

方法一將使用自動內存管理(當對象超出范圍時將刪除該對象)。

方法二是手動內存管理 - 在調用delete str;之前不會刪除它delete str; 如果您忘記刪除它 - 這會產生我們稱之為內存泄漏的內容!

通常方法一是最好的選擇,除非你有理由使用指針。 (錯誤的機會減少)

您可能會發現這有用: 為什么要使用指針?

區別在於方法一在堆棧上創建QString ,第二種方法在免費商店上創建QString (注意, QString s = "hello";QString s("hello");完全相同QString s("hello"); 。)就像parapura rajkumar所說的那樣,當你可以做的時候總是做1,而當你做不到1時總是做2。

方法1具有許多優點,其中最重要的是自動存儲器管理。 QString超出范圍時,該QString占用的內存將自動釋放,因此您無需執行任何操作來釋放其內存。 方法2要求您在完成取消分配內存時使用delete ,否則您將發生內存泄漏。

另一個優點是,它是快得多堆棧比自由存儲上創建的東西。

必須使用方法2的情況是當您需要該對象的持續時間超過您所在的范圍時。然后您將使用new分配在免費商店中,以便它將持續到您在其上調用delete ,並且然后傳遞指針。

什么時候使用方法1是正確的,什么時候使用方法2是正確的?

在這個例子中,你可以使用指針是不明顯的。 但是如果您創建自己的類,例如包含大量數據的Images,並且您希望在函數或方法中使用該類的傳遞對象,那么我建議您使用指向對象的指針而不是對象本身。 為什么? 如果你傳遞一個指向函數的指針,你只傳遞對象的內存地址(你正在復制幾個字節),但如果你自己傳遞對象,那么你傳遞的是大量數據,這會減慢你的應用程序速度。

讓我們看另一個例子:假設你有一個帶有三個參數的函數,函數體應該在函數結束時改變每個參數。 如您所知,函數只能返回一個值,因此可以更改函數體中每個參數的一種方法是使用指針。

使用指針有很多原因,使用它們時應該小心。 我建議你閱讀一些關於這個主題的文章。

我希望你理解這種差異。 關鍵概念是對象地址和對象本身之間的區別!

暫無
暫無

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

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