函數返回值有很多類型,但是什麼時候該返回引用,而什麼時候又該返回非引用呢?它們之間有什麼區別嗎?
讓我們來看兩個例子:
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]
00411C61 add eax,4
}
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]
}
結論:“&”對函數返回值的類型有着本質上的影響,如果加“&”返回該類型的指針類型,如果不加則返回該類型的基本類型(即使在函數實體內的操作是完全一樣的情況下),同時要注意返回值的作用範圍,即如果引用一個在作用域在該函數內的變量就會引發錯誤,因爲在該函數結束時,被引用變量的生命週期也會結束,所以將返回一個不存在的值。當函數要返回一個作用域在該函數範圍的變量時不能使用“&”!