標籤:對象 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++對象賦值的四種方式