文章**
(1)在實際的程式中,引用主要被用做函式的形式引數--
通常將類物件傳遞給乙個函式.
引用必須初始化.
但是用物件的位址初始化引用是錯誤的,我們可以定義乙個指標引用。 1
intival = 1092; 2
int&re = ival;
//ok 3
int&re2 = &ival;
//錯誤 4
int*pi = &ival; 5
int*&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
4intmain() 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引用詳解
文章 http blog.csdn.net k2eats archive 2008 06 12 2541790.aspx 1 在實際的程式中,引用主要被用做函式的形式引數 通常將類物件傳遞給乙個函式 引用必須初始化 但是用物件的位址初始化引用是錯誤的,我們可以定義乙個指標引用。1int ival 1...
C const引用詳解
今天做c primer的習題,前面關於引用的部分,又傻了。哎,補基礎吧。收集了一下別人的講解。1 在實際的程式中,引用主要被用做函式的形式引數 通常將類物件傳遞給乙個函式.引用必須初始化.但是用物件的位址初始化引用是錯誤的,我們可以定義乙個指標引用。1 int ival 1092 2 int re ...
C const引用 臨時變數 引用引數
c 引用 臨時變數 引用引數和const引用 如果實參與引用引數不匹配,c 將生成臨時變數。如果引用引數是const,則編譯器在下面兩種情況下生成臨時變數 實參型別是正確的,但不是左值 實參型別不正確,但可以轉換為正確的型別 左值引數是可被引用的資料物件,例如,變數 陣列元素 結構成員 引用和被解除...