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 物件賦值的四種方式
1.引用作為引數的方式傳遞.getobject object obj obj.value value1 特點 在外部構造乙個物件.把該物件以引用的方式傳遞到函式中.從而實現對該物件的改變,該引數實質是乙個 out 型別的引數,而非 in 型別的引數.這裡的引用可以稱為別名.點評 這種方式需要特別的注...
c 四種不同的物件生存方式
在c 中,有四種方法可以產生乙個物件。第一種方法是在堆疊 stack 之中產生它 void myfunc 第二種方法是在堆積 heap 之中產生它 void myfunc 第三種方法是產生乙個全域物件 同時也必然是個靜態物件 cfoo foo 在任何函式範圍之外做此動作 第四種方法是產生乙個區域靜態...
C 中物件的四種相等比較方式
c 中物件的四種相等比較方式如下 1.referenceequals object o1,object o2 比較兩個物件的引用,引用相同返回true,否則返回false,同為null是返回true 2.equals object o 虛擬equals方法,比較引用,可以重寫比較值 3.equals...