C const引用 臨時變數 引用引數

2021-08-01 17:32:53 字數 1806 閱讀 2474

臨時變數、引用引數和const

如果實參與引用引數不匹配,c++將生成臨時變數。現在,僅當引數是const引用,c++才允許這樣做,這是乙個新的機制。在下面這兩種情況下,c++編譯器將生成臨時變數:

實參型別是正確的,但不是左值

實參型別不正確,但可以轉換為正確的型別

左值引數是可被引用的資料物件,例如,變數、陣列元素、結構成員、引用和被解除引用的指標都是左值,非左值包括字面常量和包含多項式的表示式。定義乙個函式

[cpp]view plain

copy

double refcube(

const

double

& ra)

double

side = 3.0;  

double

* pd = &side;  

double

& rd = side;  

long

edge = 5l;  

double

lens[4]=;  

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指向它。這些臨時變數只在函式呼叫期間存在,伺候編譯器便可以任意將其刪除

那麼為什麼對於常量引用,這種行為是可行的,其他情況下卻不行呢?

void swapr(int& a,int& b)

在早期的c++較寬鬆的規則下,執行下面的操作將發生什麼?

long a = 3,b = 5;

swapr(a,b);

這裡的型別不匹配,因此編譯器將建立兩個臨時的int變數,將他們初始化為3和5,然後交換臨時變數的內容,而a和b保持不變

現在來看refcube()函式,該函式的目的只是使用傳遞的值,而不是修改他們,因此臨時變數不會造成任何不利的影響。反而會使函式在可處理的引數種類方面更通用。因此,如果宣告將引用指定為const,c++將在必要時生成臨時變數、實際上,對於形參為const引用的c++函式,如果實參不匹配,則其行為類似於按值傳遞,為確保原始資料不被修改,將使用臨時變數來儲存值、

(ps:如果函式呼叫的引數不是左值或與相應的const引用引數的型別不匹配,則c++將建立型別正確的匿名變數,將函式呼叫的引數的值傳遞給該匿名變數,並讓引數來引用該變數)

應盡可能使用const

使用cosnt可以避免無意總修改資料的程式設計錯誤

使用const使函式能夠處理const和非const實參,否則將只能接受非const資料

使用const引用使函式能夠正確生成並使用臨時變數

C const引用 臨時變數 引用引數

c 引用 臨時變數 引用引數和const引用 如果實參與引用引數不匹配,c 將生成臨時變數。如果引用引數是const,則編譯器在下面兩種情況下生成臨時變數 實參型別是正確的,但不是左值 實參型別不正確,但可以轉換為正確的型別 左值引數是可被引用的資料物件,例如,變數 陣列元素 結構成員 引用和被解除...

C const引用詳解

文章 http blog.csdn.net k2eats archive 2008 06 12 2541790.aspx 1 在實際的程式中,引用主要被用做函式的形式引數 通常將類物件傳遞給乙個函式 引用必須初始化 但是用物件的位址初始化引用是錯誤的,我們可以定義乙個指標引用。1int ival 1...

C const引用詳解

文章 1 在實際的程式中,引用主要被用做函式的形式引數 通常將類物件傳遞給乙個函式.引用必須初始化.但是用物件的位址初始化引用是錯誤的,我們可以定義乙個指標引用。1 intival 1092 2 int re ival ok 3 int re2 ival 錯誤 4 int pi ival 5 int...