16 November 2011
C++: Reference (參考)

前面一篇講了pointer,這篇要講只有C++才有的reference,
C是沒有reference的,相較於pointer,reference顯得平易近人多了!
reference有個很大的特性,它的意思是別名(alias)的意思!
reference不像pointer記錄著變數的記憶體位置,它只是變數的別名!

下面用個簡單的例子講解:

int iValue = 2;
int &iReference = iValue;
cout << iReference << endl; //會印出2
cout << &iReference << endl; //會印出iValue 的記憶體位置
cout << &iValue << endl;    //會印出iValue本身自己的記憶體位置

上面的範例宣告了一個整數變數(iValue),和一個參考變數(iReference) 第一行會先印出2,
因為前面說過參考只是別名, 意思就是說iReference是iValue的別名,
在白話一點iReference等於iValue,
所以第二行會印出iReference(也就是iValue)的記憶體位置,假設印出0x28ff44(每台電腦都不一定是這個值)
第三行就是印出iValue自己的記憶體位置,所以!!!它也會印出0x28ff44!! 跟第二行一樣!! (因為他們兩個相等咩)

reference跟pointer不一樣的還有幾點,
reference一定要有初始值!!!
取值不需要加上*!!

不過其實參考使用的時機大部分是用在函數時, 因為是別名,所以可以避免複製大量的變數到函數去(就算是pointer函數,也會複製)
下面是一個簡單的參考函數範例:

void fnReference(int &iValue){
iValue = iValue +1;
cout << iValue << endl;
}
main(){

int iValue = 2;
fnReference(iValue);
cout << iValue << endl;

system("pause");
return 0;
}


在上面的範例我們宣告了一個函數(fnReference),其傳遞參數為參考型態(&iValue)
在主程式中(main),傳遞了單純的整數變數進去,
跟pointer不一樣,pointer是傳記憶體位置進去,
參考就直接傳普通的變數進去,
我們在函數中把傳遞進去的參數+1,然後印出,會印出3,
回到主程式以後,在印出iValue,一樣會印出3。
因為我們是傳遞參考,這就是call by reference!

最後,reference還有一個跟pointer不一樣的點!
就是reference不能用來進行運算!!!!!








blog comments powered by Disqus