C++對象賦值的四種方式

來源:互聯網
上載者:User

標籤:對象   amp   別名   附加   空間   問題   直接   效率   函數   

1.  引用作為參數的方式傳遞.

GetObject(Object& obj)

{

     obj.value = value1;

}

 

特點: 在外部構造一個對象. 把該對象以引用的方式傳遞到函數中. 從而實現對該對象的改變, 該參數實質是一個[out]類型的參數, 而非[in]類型的參數. 這裡的引用可以稱為別名.

 

點評: 這種方式需要特別的注釋參數是[Out]還是[In]類型, 防止無用. 另外用Get這樣的名稱, 一般都是指存在傳回值的. 這樣會存在理解和溝通的問題. 需要特別注釋.

 

這種方式很值得推薦, 因為函數沒有分配記憶體. 不會涉及到記憶體的釋放操作, 很安全.

 

 

2. 用指標的方式, 傳遞參數,

 

GetObject(Object* obj)

{

     obj->value = value1;

}

 

這個方式跟上面的方式完全一致. 指標跟引用(別名)是指上是一個相同的方式. 是指上所指的都是相同的記憶體地區.

點評: 同1.

 

3. 函數內部, 在Heap中構造一個對象, 並在外面返回該對象的指標.

 

Object* GetObject()

{

    Object *a = new Object();

    return a;

}

 

點評:  既然在Heap中構造了一個對象, 準備在哪裡將其釋放? 是個問題.

 

這裡非常容易造成記憶體流失的, 因為記憶體配置和釋放的原則是: 哪裡分配, 就在哪裡釋放, 顯然這裡是滿足不了要求的.

當然, 上述原則並不絕對(跨模組調用的話, 強烈建議堅持該原則.)

 

4. 以傳回值的方式, 直接返回一個對象.

 

Object GetObject()

{

    Object a;

    return a;

}

點評: a對象會複製一份, 交給傳回值.

這樣造成的問題是, 需要提供copy建構函式, 否則會出大問題的.

另外,  對象的複製, 進行了大量的工作, 將導致效率下降, 同事棧的空間也被佔用. 代價還是比較高昂.

 

 

//附加一些容易犯的錯誤.

 

問題1: 下面的例子的問題是, a對象離開範圍(函數)時, 將可能被自動釋放, 造成指標指向的位置被清理的問題.

Object * GetObject()

{

    Object a;

    return &a;

}

 

問題2: 下面的例子, 不但造成了記憶體流失, 並且*a所指的對象仍然被複製了一份. 即引發了效率低下, 以及記憶體流失兩個問題.

Object GetObject()

{

    Object *a = new Object();

    return *a;

}

 

C++對象賦值的四種方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.