指針引用就是一個指針的引用,看下面例1:
int a = 10;
int b = 20;
void swap(int& lhs, int& rhs)
{
int tmp = lhs;
lhs = rhs;
rhs = tmp;
}
swap(a, b);
上面的程式可以成功交換兩個int值,但是如果形參傳的是int而非其引用的話則不會交換2個int值,因為形參非引用的情況下,編譯器會複制a,b然後把a,b的拷貝傳到swap函數中,交換的隻是a,b的拷貝而已,是以失敗。但是傳引用則可以成功。
例2:
/* 查找機車
* @name: 機車名字
* @crg: 被查找到的機車
* @return: 未找到機車傳回false;否則傳回true
*/
bool find(LPCTSTR name, Carriage* &crg);
bool CRG_Repository::find(LPCTSTR name, Carriage *&crg)
for (size_t i=0;i<crgs_.size();i++)
{
if (name==crgs_[i]->name())
{
crg=crgs_[i];
return true;
}
}
return true;
}
上面程式根據name查找機車,其中機車存放在一個容器中:std::deque<Carriage *> crgs_
并傳回找到的這個機車的指針。
如果find函數的第二個參數不傳指針的引用而傳指針的話,可能如下所示:
Carriage* found;
CRG_Repository crep;
crep.find("123", found);
這樣的調用不會改變found這個指針的值,find函數僅僅改變了found的拷貝而已,是以失敗。
當傳指針引用的時候則會成功,因為:傳引用編譯器不會拷貝一個found傳到find函數中去,而是直接傳遞found,在find函數内部的修改就是found本身,而不是它的拷貝;修改完後,found的值變了,當然可以成功。
當然這個find函數也可以這樣
Carriage* find(LPCTSTR name);
是以傳指針引用的目的是要修改這個指針,調用函數之後修改這個指針的值,獲得這個修改後的值以備他用。
總結一下:傳引用的目的一般是為了修改這個傳遞的是引用的參數,然後傳回這個值(以後程式中會用到);或者是不讓編譯器對參數進行拷貝,提高效率。