若是實參與引用參數不匹配,C++將生成臨時變量。若是引用參數是const,則編譯器在下面兩種狀況下生成臨時變量:編程
實參類型是正確的,但不是左值數組
實參類型不正確,但能夠轉換爲正確的類型ide
左值參數是可被引用的數據對象,例如,變量、數組元素、結構成員、引用和被解除引用的指針都是左值,非左值包括字面常量和包含多項式的表達式。定義一個函數函數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
Double refcube(
const
double
& ra)
{
Returnra*ra*ra;
}
double
side = 3.0;
double
* pd = &side;
double
& rd = side;
long
edge = 5L;
double
lens[4]={2.3,3.4,4.5,6.7};
double
c1 = refcube(side);
// ra 是side
double
c2 = refcube(lens[2]);
// ra是lens[2]
double
c3 = refcube(rd);
// ra 是 rd
double
c4 = refcube(*pd);
// ra 是*pd
double
c5 = refcube(edge);
// ra 是臨時變量
double
c6 = refcube(7.0);
// ra 是臨時變量
double
c7 = refcube(side+10.0);
// ra 是臨時變量
|
參數side lens[2] rd 和*pd都是有名稱的、double類型的數據對象,所以能夠爲其建立引用,而不須要臨時變量。可是edge雖然是變量,類型卻不正確,double引用不能指向long。另外一方面,參數7.0和side+10.0的類型都正確,但沒有名稱,在這些狀況下,編譯器都將生成一個臨時匿名變量,並讓ra指向它。這些臨時變量只在函數調用期間存在,伺候編譯器即可以任意將其刪除spa
那麼爲何對於常量引用,這種行爲是可行的,其餘狀況下卻不行呢?.net
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Void swapr(
int
& a,
int
& b)
{
Inttemp;
Temp=a;
A= b;
B= temp;
}
|
在早期的C++較寬鬆的規則下,執行下面的操做將發生什麼?指針
Long a = 3,b = 5;code
Swapr(a,b);htm
這裏的類型不匹配,所以編譯器將建立兩個臨時的int變量,將他們初始化爲3和5,而後交換臨時變量的內容,而a和b保持不變對象
簡而言之,若是接受引用參數的函數的意圖是修改做爲參數傳遞的變量,則建立臨時變量將阻止這種意圖的實現,解決方法是,禁止建立臨時變量,下載的C++標準正是正陽作的、
如今來看refcube()函數,該函數的目的只是使用傳遞的值,而不是修改他們,所以臨時變量不會形成任何不利的影響。反而會使函數在可處理的參數種類方面更通用。所以,若是聲明將引用指定爲const,C++將在必要時生成臨時變量、實際上,對於形參爲const引用的C++函數,若是實參不匹配,則其行爲相似於按值傳遞,爲確保原始數據不被修改,將使用臨時變量來存儲值、
(PS:若是函數調用的參數不是左值或與相應的const引用參數的類型不匹配,則C++將建立類型正確的匿名變量,將函數調用的參數的值傳遞給該匿名變量,並讓參數來引用該變量)
應儘量使用const
使用cosnt能夠避免無心總修改數據的編程錯誤
使用const使函數可以處理const和非const實參,不然將只能接受非const數據
使用const引用使函數可以正確生成並使用臨時變量
以上這篇C++ const引用、臨時變量 引用參數詳解就是小編分享給你們的所有內容了,但願能給你們一個參考,也但願你們多多支持腳本之家。