C++引用的詳細(xì)解釋
一、C++ 引用
變量名,本身是一段內(nèi)存的引用,即別名(alias)。此處引入的引用,是為己有變量起一個(gè)別名。
聲明如下
int main() { int a; int &b = a; }
1.規(guī)則
1.引用沒有定義,是一種關(guān)系型聲明。聲明它和原有某一變量的關(guān)系。類型與原有類型保持一致,且不分配內(nèi)存。與被引用的變量有相同的地址。
2.聲明的時(shí)候必須初始化,一經(jīng)聲明,不可變更。
3.可對(duì)引用,再次引用。多次引用的結(jié)果,是某一個(gè)變量具有多個(gè)別名。
4.&符號(hào)前面有數(shù)據(jù)類型時(shí),是引用。其他均為取地址。
#include <iostream> using namespace std; int main() { int a,b; int &r = a; int &r = b; //錯(cuò)誤,不可更改原有的引用關(guān)系 float &rr = b; //錯(cuò)誤,引用類型不匹配 cout<<&a<<&r<<endl; //變量與引用具有相同的地址。 int &ra = r; //可對(duì)引用更次引用,表示 a 變量有兩個(gè)別名,分別是 r 和 ra }
2.應(yīng)用
1.值作函數(shù)參數(shù)
void swap(int a, int b); //無法實(shí)現(xiàn)兩數(shù)據(jù)的交換 void swap(int *p, int *q); //開辟了兩個(gè)指針空間實(shí)現(xiàn)交換
2.引用作函數(shù)參數(shù)
#include <iostream> using namespace std; void swap(int &a, int &b){ int tmp; tmp = a; a = b; b = tmp; } int main(){ int a = 3,b = 5; cout<<"a = "<<a<<"b = "<<b<<endl; swap(a,b); cout<<"a = "<<a<<"b = "<<b<<endl; return 0; }
c++中引入引用后,可以用引用解決的問題。避免用指針來解決。
3.引用提高
引用的本質(zhì)是指針,C++對(duì)裸露的內(nèi)存地址(指針)作了一次包裝。又取得指針的優(yōu)良特性。所以再對(duì)引用取地址,建立引用的指針沒有意義
1.可以定義指針的引用,但不能定義引用的引用。
int a; int* p = &a; int*& rp = p; // ok int& r = a; int&& rr = r;//error
例子:
#include <iostream> using namespace std; void swap(char *pa,char *pb) { char *t; t=pa; pa=pb; pb=t; } void swap2(char **pa,char **pb) { char *t; t=*pa; *pa=*pb; *pb=t; } void swap3(char *&pa,char *&pb)//指針的引用 { char *t; t=pa; pa=pb; pb=t; } int main() { char *pa="china"; char *pb="america"; cout<<"pa"<<pa<<endl; cout<<"pb"<<pb<<endl; //swap(pa,pb); //swap2(&pa,&pb); swap3(pa,pb); cout<<"pa"<<pa<<endl; cout<<"pb"<<pb<<endl; return 0; }
2.可以定義指針的指針,不能定義引用的指針。
int a; int* p = &a; int** pp = &p; // ok int& r = a; int&* pr = &r; // error
3.可以定義指針數(shù)組,但不能定義引用數(shù)組,可以定義數(shù)組引用。
int a, b, c; int* parr[] = {&a, &b, &c}; // ok int& rarr[] = {a, b, c}; // error int arr[] = {1, 2, 3}; int (&rarr)[3] = arr; // ok
4.常引用
const 引用有較多使用。它可以防止對(duì)象的值被隨意修改。因而具有一些特性。
(1)const 對(duì)象的引用必須是 const 的,將普通引用綁定到 const 對(duì)象是不合法的。
這個(gè)原因比較簡(jiǎn)單。既然對(duì)象是 const 的,表示不能被修改,引用當(dāng)然也不能修改,必須使用 const 引用。實(shí)際上,const int a=1; int &b=a;這種寫法是不合法的,編譯不過。
(2)const 引用可使用相關(guān)類型的對(duì)象(常量,非同類型的變量或表達(dá)式)初始化。
這個(gè)是const 引用與普通引用最大的區(qū)別。const int &a=2;是合法的。double x=3.14; const int&b=x;也是合法的。
4.常引用原理
const 引用的目的是,禁止通過修改引用值來改變被引用的對(duì)象。const 引用的初始化特性較為微妙,可通過如下代碼說明
double val = 3.14; const int &ref = val; // int const & int & const ?? double & ref2 = val; cout<<ref<<" "<<ref2<<endl; val = 4.14; cout<<ref<<" "<<ref2<<endl;
上述輸出結(jié)果為 3 3.14 和 3 4.14。因?yàn)?ref 是 const 的,在初始化的過程中已經(jīng)給定值,不允許修改。而被引用的對(duì)象是 val,是非 const 的,所以 val 的修改并未影響 ref 的值,而 ref2 的值發(fā)生了相應(yīng)的改變。
那么,為什么非 const 的引用不能使用相關(guān)類型初始化呢?實(shí)際上,const 引用使用相關(guān)類型對(duì)象初始化時(shí)發(fā)生了如下過程:
int temp = val; const int &ref = temp;
如果 ref 不是 const 的,那么改變 ref 值,修改的是 temp,而不是 val。期望對(duì) ref 的賦值會(huì)修改 val 的程序員會(huì)發(fā)現(xiàn) val 實(shí)際并未修改。
int i=5; const int & ref = i+5; //此時(shí)產(chǎn)生了與表達(dá)式等值的無名的臨時(shí)變量, //此時(shí)的引用是對(duì)無名的臨時(shí)變量的引用。故不能更改。 cout<<ref<<endl;
5.const的好處
1,使用 const 可以避免無意修改數(shù)據(jù)的編程錯(cuò)誤。
2,使用 const 可以處理 const 和非 const 實(shí)參。否則將只能接受非 const 數(shù)據(jù)。
3,使用 const 引用,可使函數(shù)能夠正確的生成并使用臨時(shí)變量(如果實(shí)參與引用參數(shù)不匹配,就會(huì)生成臨時(shí)變量)
6.引用的本質(zhì)淺析
1.大小與不可再引用
struct TypeP { char *p; }; struct TypeC { char c; }; struct TypeR { char& r; //把引用單列出來,不與具體的對(duì)象發(fā)生關(guān)系 }; int main() { printf("%d %d %d\n",sizeof(TypeP),sizeof(TypeC),sizeof(TypeR)); return 0; }
結(jié)論:引用的本質(zhì)是,是對(duì)常指針 type * const p 的再次包裝。
1、const int *pi 指向常量的指針。 2、int * const pi 指針本身是一個(gè)常量,稱為“指針常量”、“常指針”。 3、const int * const pi 指向常量的指針常量。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++實(shí)現(xiàn)判斷一個(gè)字符串是否為UTF8或GBK格式的方法
這篇文章主要介紹了C++實(shí)現(xiàn)判斷一個(gè)字符串是否為UTF8或GBK格式的方法,涉及C++針對(duì)字符編碼的遍歷、判斷、編碼轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11C++實(shí)現(xiàn)LeetCode(22.生成括號(hào))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(22.生成括號(hào)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++ Cmake的構(gòu)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)詳解
這篇文章主要為大家詳細(xì)介紹了C++ Cmake的構(gòu)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03