當C++使用引用傳遞參數時,應當注意的問題

若是實參與引用參數不匹配,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引用、臨時變量 引用參數詳解就是小編分享給你們的所有內容了,但願能給你們一個參考,也但願你們多多支持腳本之家。

相關文章
相關標籤/搜索