C const引用詳解

2021-04-19 18:05:43 字數 3671 閱讀 1867

文章** http://blog.csdn.net/k2eats/archive/2008/06/12/2541790.aspx

(1)在實際的程式中,引用主要被用做函式的形式引數

--通常將類物件傳遞給乙個函式

.引用必須初始化

. 但是用物件的位址初始化引用是錯誤的,我們可以定義乙個指標引用。

1int

ival = 1092;

2int

&re = ival;

//ok

3int

&re2 = &ival;

//錯誤 4

int*pi = &ival;

5int

*&pi2 = pi;

//ok

(2)一旦引用已經定義,它就不能再指向其他的物件

.這就是為什麼它要被初始化的原因。

(3)const

引用可以用不同型別的物件初始化

(只要能從一種型別轉換到另一種型別即可

),也可以是不可定址的值,如文字常量。例如

double

dval = 3.14159;

//下3行僅對

const

引用才是合法的

const

int&ir = 1024;

const

int&ir2 = dval;

const

double

&dr = dval + 1.0;

上面,同樣的初始化對於非

const

引用是不合法的,將導致編譯錯誤。原因有些微妙,需要適當做些解釋。

引用在內部存放的是乙個物件的位址,它是該物件的別名。對於不可定址的值,如文字常量,以及不同型別的物件,編譯器為了實現引用,必須生成乙個臨時物件,引用實際上指向該物件,但使用者不能訪問它。例如:

double

dval = 23;

const

int&ri = dval;

編譯器將其轉換為:

inttmp = dval;

// double -> int

const

int&ri = tmp;

同理:上面**

double

dval = 3.14159;

//下3行僅對

const

引用才是合法的

const

int&ir = 1024;

const

int&ir2 = dval;

const

double

&dr = dval + 1.0;

內部轉化為:

double

dval = 3.14159;

//不可定址,文字常量

inttmp1 = 1024;

const

int&ir = tmp1;

//不同型別

inttmp2 = dval;

//double -> int

const

int&ir2 = tmp2;

//另一種情況,不可定址

double

t*** = dval + 1.0;

const

double

&dr = t***;

(4)不允許非

const

引用指向需要臨時物件的物件或值,即,編譯器產生臨時變數的時候引用必須為

const!!!!

切記!!

intiv = 100;

int*&pir = &iv;

//錯誤,非

const

引用對需要臨時物件的引用

int*const

&pir = &iv;

//ok

const

intival = 1024;

int*&pi_ref = &ival;

//錯誤,非

const

引用是非法的

const

int*&pi_ref = &ival;

//錯誤,需要臨時變數,且引用的是指標,而

pi_ref

是乙個非常量指標

const

int*

const

&pi_ref = &ival;

//正確 //

補充 const

int*p = &ival;

const

int*&pi_ref = p;

//正確

(5)********

對於const int *const & pi_ref = &iva;

具體的分析如下:

*********

1.不允許非

const

引用指向需要臨時物件的物件或值

inta = 2;

int&ref1 = a;

// ok.

有過渡變數。

const

int&ref2 = 2;

// ok.

編譯器產生臨時變數,需要

const引用

2.位址值是不可定址的值

int* const

&ref3 = &a;

// ok; 3.

於是,用

const

物件的位址來初始化乙個指向指標的引用

const

intb = 23;

const

int*p = &b;

const

int*& ref4 = p;

const

int*

const

& ref5 = &b;

//ok

const

引用的語義到底是什麼?

最後,我們可能仍然不明白

const

引用的這個

const

的語義是什麼

const

引用表示,試圖通過此引用去(間接

)改變其引用的物件的值時,編譯器會報錯!

這並意味著,此引用所引用的物件也因此變成

const

型別了。我們仍然可以改變其指向物件的值,只是不通過引用

下面是乙個簡單的例子: 1

#include 2

using

namespace

std;

3 4int

main()

5 其中第10

行,如果我們通過

ir來改變

val的值,編譯時會出錯。但是我們仍然可以通過

val直接改變其值(第

9行)

總結:const

引用只是表明,保證不會通過此引用間接的改變被引用的物件!

另外,const

既可以放到型別前又可以放到型別後面,放型別後比較容易理解:

string const *t1;

const string *t1;

typedef string* pstring;string s;

const pstring cstr1 = &s;

就出錯了

但是放在型別後面不會出錯

:

pstring const cstr2 = &s;

C const引用詳解

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

C const引用詳解

今天做c primer的習題,前面關於引用的部分,又傻了。哎,補基礎吧。收集了一下別人的講解。1 在實際的程式中,引用主要被用做函式的形式引數 通常將類物件傳遞給乙個函式.引用必須初始化.但是用物件的位址初始化引用是錯誤的,我們可以定義乙個指標引用。1 int ival 1092 2 int re ...

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

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