※ 引述《Piz.bbs@bbs.kimo.com.tw (要唸的書好多)》之銘言:
> #include <iostream>
> using namespace std;
> void swap(int *a,int *b) <--> void swap(int &a,int &b)
> { {
> int temp; int temp;
> temp = *a; temp = a;
> *a=*b; a = b;
> *b=temp; b=temp;
> } }
> void main()
> {
> int a,b;
> cout << "key in two num\n";
> cin >> a >> b;
> cout << "before swap " << a << b << endl;
> swap(&a,&b); <--> swap(a,b);
> cout << "after swap " << a << b;
> }
> 這個程式做的事是一樣的
> 左選寫的是call by address , 右邊寫的是call by reference
> 寫法上只是差別在於 & 及 *...
> 我想問的是兩者有差嗎!? 底層做的事不是都一樣嗎!?
> 兩者的差別在哪!?
基本上是相同的,不過呼叫 function 時,不需要使用 & 變數指標位址,
function內部也不需要再使用 * 取變數值(設定變數值)。
另外 reference 有更多其他用途。比方若是撰寫函式本身是傳如物件時,
透過 reference 會有很大的好處與便利。
class mynum
{
public:
mynum() { value=0; }
mynum(int i) { value=i; }
int getvalue(void) { return value; }
mynum operator+(mynum o) { return mynum(value + o.getvalue()); }
private:
int value;
};
當使用下面程式碼時:
mynum a(10),b(20),c;
c = a + b;
不過要呼叫 operator+() 時,系統會另外產生一份 b 的 copy (於堆疊內),
然後再呼叫 operator+(),所以 operator+() 裡面取到的物件是 b 的複製體。
產生一份複製體,基本上若是該 object 有許多資料時,產生 b 的複製體需要
耗費時間,而且還會佔用堆疊空間,這樣子基本上很浪費資源而且沒效率。
也許你可以改寫傳入方式,改成傳指標解決。因為這時候傳物件的指標位址,
就不用複製一份物件後再去呼叫 operator+()。
class mynum
{
public:
mynum() { value=0; }
mynum(int i) { value=i; }
int getvalue(void) { return value; }
mynum operator+(const mynum *b) { return mynum(value + b->getvalue()); }
private:
int value;
};
但是改成這樣子的話,要呼叫 operator+() 會很奇怪。程式碼會像這樣子:
mynum a(10),b(20),c;
c = a + &b;
若是再多一個 mynum object,那程式碼是:
mynum a(10),b(20),c(30),d;
d = a + &b + &c;
若是 operator+() 修改變成傳入 reference 時..
class mynum
{
public:
mynum() { value=0; }
mynum(int i) { value=i; }
int getvalue(void) { return value; }
mynum operator+(const mynum &b) { return mynum(value+b.getvalue()); }
private:
int value;
};
那程式碼撰寫如下:
mynum a(10),b(20),c(30),d;
d = a + b + c;
這樣子閱讀上會方便很多。
--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: kendlee.sayya.org