C 物件賦值的四種方式

2021-09-01 20:30:12 字數 1312 閱讀 6592

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...