C const引用的用法與坑

2021-08-31 21:41:53 字數 2030 閱讀 2558

c++中const引用(reference to const)有一些特殊的用法,需要大家注意。對於普通引用,必須在初始化時繫結到乙個型別一致的具名物件上。但const引用可以繫結到非常量物件、字面值、表示式,甚至其他可轉換的型別上(型別不要求一致)。其中涉及臨時物件的生成,對臨時物件的修改不會反應到原始物件上,一定要注意。下面詳細介紹。

可以把引用繫結到const物件上,就像繫結到其他物件上一樣,我們稱之為對常量的引用,或const引用。與普通引用不同的是,對常量的引用不能被用來修改它所繫結的物件:

const int ci = 1024;

const int &r1 = ci; // 正確:引用及其繫結的物件都是常量

r1 = 42; // 錯誤:r1是對常量的引用

int &r2 = ci; // 錯誤:試圖讓乙個非常量引用指向乙個常量物件

因為不允許直接為ci賦值,當然也就不能通過引用去改變ci。因此,對r2的初始化是錯誤的。假設該初始化合法,則可以通過r2來改變它引用物件的值,這顯然是不正確的。

與普通引用的初始化不同,在初始化常量引用時,允許用任意表示式作為初始值,只要該表示式的結果能轉換成引用的型別即可。尤其,允許為乙個常量引用繫結非常量的物件、字面值,甚至是個一般表示式:

int i = 42;

double &j = i; // 錯誤:普通引用的型別要和其所繫結物件的型別一致

const int &r1 = i; // 正確:允許將const int&繫結到乙個普通int物件上

const int &r2 = 42; // 正確:r2是乙個常量引用

const int &r3 = r1 * 2; // 正確:r3是乙個常量引用

int &r4 = 42; // 錯誤:r4是乙個普通引用,只能繫結具名物件

int &r5 = r1 * 2; // 錯誤:r5是乙個普通引用,只能繫結具名物件

要想理解這種例外情況的原因,最簡單的辦法是弄清楚當乙個常量引用被繫結到另外一種型別上時到底發生了什麼:

double dval = 3.14;

const int &ri = dval;

此處,ri引用了乙個int型的數,對ri的操作應該是整數運算,但dval確是乙個double而非int。因此為了確保讓ri繫結乙個int數,編譯器把上述**變成了如下形式:

const int temp = dval;    // 由double數生成乙個臨時的int常量

const int &ri = temp; // 讓ri繫結這個臨時量

在這種情況下,ri繫結了乙個臨時(temporary)物件。所謂臨時物件就是當編譯器需要乙個空間來暫存表示式的求值結果時臨時建立的乙個未命名的物件。c++程式設計師常把臨時物件簡稱為臨時量。上面的**中有乙個需要注意的點:因為ri繫結了臨時量temp,所以修改dval不會反應到ri上:

dval = 9.99;

std::cout << ri << std::endl; // 由於ri引用了臨時量temp,修改dval不會反應到ri上,ri為3

必須認識到,const引用僅對引用可參與的操作做出了限定,對於引用的物件本身是不是乙個常量未作限定。因為物件也可能是個非常量,所以允許通過其他途徑改變他的值:

int i = 42;

int &r1 = i; // r1繫結物件i

const int &r2 = i; // r2也繫結物件i,但是不允許通過r2修改i的值

r1 = 0; // r1並非常量,i的值修改為0,r2也修改為0

r2 = 0; // 錯誤:r2是乙個常量引用

r2繫結(非常量)整數i是合法的行為。然而,不允許通過r2修改i的值。儘管如此,i的值仍然允許通過其他途徑修改,既可以直接給i賦值,也可以通過r1來修改。

c const與 define的用法總結

1 const a.可以用來定義常量 修飾函式引數 修飾函式返回值等三個作用。編譯階段 b.被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。2 define define是乙個巨集定義,可以定義乙個全域性變數,在整個檔案中都可以使用,它只是乙個字元替換操作,不做型別檢查...

c const的使用(引用,指標)

1 const 物件,一旦建立後,值就不能在改變,所以要對const物件進行初始化 const int i get size 初始值可以是任意複雜的表示式 const int j 42 對 const int k 錯 2 例 const int bufsize 512 編譯器會在編譯過程中,把所有用...

C const 和 指標 的用法

const 和 指標 組合在一起有2大 類,共4 種形式。參考 c primer 常量本身不能被修改,也不能通過指標去修改。注意事項 只要所指的物件是常量,必須要用const放在 左邊來修飾指標,而不能使用普通的指標。const int i 3 定義乙個常量 const int j 4 const ...