精華區beta ck49th318 關於我們 聯絡資訊
※ 引述《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