天天看點

effective c++ ------不要傳回指向局部對象指針或引用,該傳回對象就傳回對象.

首先我們來看一個例子:

#include <iostream>
using namespace std;

const int  &fun1(int a,int b)
{
  int i=0;
  i = a + b;
  return i;
}

int main()
{
  if (fun1(1, 2) == fun1(2, 5))
  {
    cout << fun1(1, 2) << endl;
    cout << fun1(2, 5) << endl;
    cout << "sb" << endl;
  }
  else
    cout << "bushisb" << endl;
}      
effective c++ ------不要傳回指向局部對象指針或引用,該傳回對象就傳回對象.

請看為什麼if語句裡面的條件為真呢?這裡我可以告訴大家,不管當傳遞給a b的值如何變化,if語句永遠為真,當時輸出值為什麼不相等呢?

分析:函數fun1傳回的是局部對象引用,這個對象函數推出前local對象i已經被銷毀,其傳回的引用永遠指向一個過時的i。是以if語句裡面的條件永遠為真。

再來看一個列子:

class A{ };

const A operator*(const c A& a1,const A& a2);

這個operator*是以by value 傳回方式傳回其計算結果,有人想改為傳遞reference方式已達到不需要付出任何代價去傳值:

const A& operator*(const c A& a1,const A& a2);

分析:記住,所謂reference隻是個名稱,代表某個既有的對象,任何時候看到一個reference聲明的方式,你都應該立刻問自己,它的另外一個名稱是什麼?因為它是一定是某物的另一個名稱。如果他傳回一個引用,那麼傳回一個指向某個既有的對象.

A a(1,2);