極限研究-"&"函數返回引用與返回普通類型的區別

 函數返回值有很多類型,但是什麼時候該返回引用,而什麼時候又該返回非引用呢?它們之間有什麼區別嗎?

讓我們來看兩個例子:

//函數返回引用 int &test1(int test_array[]) {     return test_array[1]; } //函數返回普通類型 int test2(int test_array[]) {     return test_array[1]; }

仔細觀察這兩個函數,你會發現函數主體一樣的:return test_array[1];

那它們返回的結果是否一樣呢?

void main(int argc,char *argv[]) {     int test[5]={0,1,2,3,4};     test1(test);     test2(test); }

調試該程序:

分別在test1、test2內部下斷點:

int &test1(int test_array[]) { 00411C40  push        ebp   00411C41  mov         ebp,esp  00411C43  sub         esp,0C0h  00411C49  push        ebx   00411C4A  push        esi   00411C4B  push        edi   00411C4C  lea         edi,[ebp-0C0h]  00411C52  mov         ecx,30h  00411C57  mov         eax,0CCCCCCCCh  00411C5C  rep stos    dword ptr es:[edi]      return test_array[1]; 00411C5E  mov         eax,dword ptr [test_array] //這裏的mov eax,dword ptr [test_array]是不是有些迷惑呢? //實際上這裏應該是mov eax,dword ptr [ebp+8],即[ebp+8]處存放第一個參數 //的地址,所以這裏的eax是獲得的數組test_array的基址  00411C61  add         eax,4  //這裏就應該十分明瞭:獲得下標爲1的數組的地址 } int test2(int test_array[]) { 00411D90  push        ebp   00411D91  mov         ebp,esp  00411D93  sub         esp,0C0h  00411D99  push        ebx   00411D9A  push        esi   00411D9B  push        edi   00411D9C  lea         edi,[ebp-0C0h]  00411DA2  mov         ecx,30h  00411DA7  mov         eax,0CCCCCCCCh  00411DAC  rep stos    dword ptr es:[edi]      return test_array[1]; 00411DAE  mov         eax,dword ptr [test_array]  //這裏就不需要再解釋了吧 00411DB1  mov         eax,dword ptr [eax+4]  //直接獲得下標爲1的數組的值 }

結論:“&”對函數返回值的類型有着本質上的影響,如果加“&”返回該類型的指針類型,如果不加則返回該類型的基本類型(即使在函數實體內的操作是完全一樣的情況下),同時要注意返回值的作用範圍,即如果引用一個在作用域在該函數內的變量就會引發錯誤,因爲在該函數結束時,被引用變量的生命週期也會結束,所以將返回一個不存在的值。當函數要返回一個作用域在該函數範圍的變量時不能使用“&”!

發佈了18 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章