亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在C+中“返回一個對象”?

如何在C+中“返回一個對象”?

C++
慕容3067478 2019-07-02 16:48:49
如何在C+中“返回一個對象”?我知道標題聽起來很熟悉,因為有很多類似的問題,但是我要求問題的另一個方面(我知道堆棧上的東西和堆中的東西之間的區別)。在Java中,我總是可以返回對“本地”對象的引用public Thing calculateThing() {     Thing thing = new Thing();     // do calculations and modify thing     return thing;}在C+中,為了做類似的事情,我有兩個選項(1)每當需要“返回”對象時,我都可以使用引用void calculateThing(Thing& thing) {     // do calculations and modify thing}然后像這樣使用它Thing thing;calculateThing(thing);(2)或者我可以返回指向動態分配對象的指針Thing* calculateThing() {     Thing* thing(new Thing());     // do calculations and modify thing     return thing;}然后像這樣使用它Thing* thing = calculateThing();delete thing;使用第一種方法,我不必手動釋放內存,但對我來說,這會使代碼難以閱讀。第二種方法的問題是,我必須記住delete thing;看起來不太好。我不想返回復制的值,因為它效率很低(我認為),下面是問題是否有第三種解決方案(不需要復制值)?如果我堅持第一個解決方案,有什么問題嗎?何時以及為什么要使用第二個解決方案?
查看完整描述

3 回答

?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

我不想返回復制的值,因為它效率低下

證明給我看。

查找RVO和NRVO,并在C+0x移動-語義。在大多數情況下,在C+03中,OUT參數只是使代碼變得丑陋的好方法,而在C+0x中,使用OUT參數實際上會對自己造成傷害。

只需編寫干凈的代碼,按值返回即可。如果性能是一個問題,分析它(停止猜測),并找到您可以做什么來修復它。它可能不會從函數中返回東西。


這就是說,如果你已經下定決心要這樣寫了,你可能會想要執行OUT參數。它避免了動態內存分配,這是更安全和一般更快。它確實要求您在調用函數之前有一些方法來構造對象,這并不總是對所有對象都有意義。

如果您想要使用動態分配,可以做的最起碼的是把它放在一個智能指針中。(無論如何,這應該一直在做)然后你不用擔心刪除任何東西,事情是異常安全的,等等。唯一的問題是,它可能比返回值慢無論如何!


查看完整回答
反對 回復 2019-07-02
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

只需創建對象并返回

Thing calculateThing() {
    Thing thing;
    // do calculations and modify thing
     return thing;}

我認為,如果您忘記了優化,只需編寫可讀的代碼(稍后需要運行分析器-但不要預先優化),您會幫自己一個忙。


查看完整回答
反對 回復 2019-07-02
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

只需返回這樣的對象:

Thing calculateThing() {
   Thing thing();
   // do calculations and modify thing
   return thing;}

這將對事物調用復制構造函數,因此您可能希望自己實現該構造函數。就像這樣:

Thing(const Thing& aThing) {}

這可能執行得稍微慢一點,但可能根本不是問題。

更新

編譯器可能會優化對復制構造函數的調用,因此不會有額外的開銷。(就像評論中指出的那樣)。


查看完整回答
反對 回復 2019-07-02
  • 3 回答
  • 0 關注
  • 564 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號