2009年12月1日 星期二

Reference vs. Address

相信大家都知道C++有個特有的參數傳遞方式 - call by reference,只是
大多數都
不太確定它跟call by address的差別與使用時機。我想藉由這篇文章分享我個人的看法。

我個人的習慣是能用call by reference就用call by reference,因為我覺得如此可以減少出錯(或者是client誤用的機率),也可以減少一些麻煩。例如List 1中因為傳進來的是pointer,所以保險起見(其實是一定要的)要先檢查它是不是nil (line 4)甚至加個assert (line 3)好讓我們在開發的時候及早發現不正常的狀況,有一點麻煩。
List 1 - Call by address
void aSimpleFunctionWhichTakesOneParameter(string *param1)
{
 assert(param1 != nil); // solid programming
 if (param1 != nil) { // sanity check as always
  //do something to param1
 }
}
但是如果改成用call by reference如List 2,那就不用管它是不是nil了。
List 2 - Call by reference
void aSimpleFunctionWhichTakesOneParameter(string &param1)
{
 //do something to param1
}
但是有人就會問"那什麼時候用call by address?",我的看法是當該參數是optional的時候(例如List 3)就該用call by address,因為如此一來client才能傳nil進來。
List 3 - Optional parameter
// a stupid function which gets lots of stuff at the same time
void getEverything(int *x, int y, int *width, int *height)
{
 if (x != nil)
  *x = 10;
 if (y != nil)
  *y = 100;
 if (width != nil)
  * width = 1000;
 if (height != nil)
  * height = 10000;

}
以上觀點供大家參考。

7 則留言:

  1. 恩恩~ 看來我誤會 call by reference 和 call by address 好久了, 以前一直認為這兩樣東西是差不多的東西. @@

    回覆刪除
  2. 我一直都只會分call by value跟 call by reference T^T。檢查nil是好習慣,我要學起來!!!XD

    回覆刪除
  3. 不過 Objective-C "大部份"的時機不用檢查

    回覆刪除
  4. 是因為Obj-C init的習慣嗎? for EX: initWithString

    回覆刪除