C 引用與const引用

2021-04-25 15:40:50 字數 3143 閱讀 2665

(1)在實際的程式中,引用主要被用做函式的形式引數--通常將類物件傳遞給乙個函式.

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

1int

ival 

=1092;2

int&

re =

ival;   

//ok

3int

&re2 =&

ival;   

//錯誤

4int

*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;//

okconst

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;  

//正確 

********對於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引用的語義到底是什麼?

最後,我們可能仍然不明白const引用的這個const的語義是什麼

const引用表示,試圖通過此引用去(間接)改變其引用的物件的值時,編譯器會報錯!

這並意味著,此引用所引用的物件也因此變成const型別了。我們仍然可以改變其指向物件的值,只是不通過引用

下面是乙個簡單的例子:

1#include 

<

iostream

>

2using

namespace

std;34

intmain()5

其中第10行,如果我們通過ir來改變val的值,編譯時會出錯。但是我們仍然可以通過val直接改變其值(第9行)

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

C 引用 const 引用

通過引用修改它指向變數的值 也就是說 通過修改 b 達到修改 a 的目的,也可以修改a int a 5 int b a b 40 int c b 此時a b c 40 例項1 宣告 double getarea int num 呼叫 double area this getarea 30 1 將30...

const引用與非const引用

const引用可讀不可改,與繫結物件是否為const無關,注意區分const引用與對const物件的引用 非const引用可讀可改,只可與非const物件繫結 const int ival 1024 const int refval ival ok both reference and object...

C 引用 指標與const

引用即繫結到另乙個物件上,因此定義了乙個引用,對其操作即是對與之繫結的物件進行操作 如為引用賦值,獲取引用的值,以引用作為初始值.與引用類似,實現對物件的間接訪問。指標和引用的本質區別 引用不是物件,指標本身即是物件。指標和引用的共同 都需要型別和物件型別嚴格匹配 不支援型別轉換 並且指標只能指向變...