C++之引用&的詳解
C++中的引用:
引用引入了對象的一個同義詞。定義引用的表示方法與定義指針相似,只是用&代替了*。引用(reference)是c++對c語言的重要擴充。引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣。
其格式為:類型 &引用變量名 = 已定義過的變量名。
引用的特點:
①一個變量可取多個別名。
②引用必須初始化。
③引用只能在初始化的時候引用一次 ,不能更改為轉而引用其他變量。
①基礎引用:
void TestReference1 () { int a = 1; int& b = a; cout<<"a:address->" <<&a<< endl; cout<<"b:address->" <<&b<< endl; a = 2; b = 3; int& c = b;// 引用一個引用變量,別名的別名 c = 4; }
②const引用:
void TestReference2 () { int d1 = 4; const int & d2 = d1; d1 = 5;//d1改變,d2的值也會改變。 //d2 = 6;//不能給常量(不能被修改的量)賦值。 const int d3 = 1; const int & d4 = d3; //int&d5 = d3; const int & d6 = 5;//常量具有常性,只有常引用可以引用常量 double d7 = 1.1; //int& d8 = d7;//d7是double類型,d8是int,d7賦值給 d8時要生成一個臨時變量 //也就是說d8引用的是這個帶有常性的臨時變量,所以不能賦值。 const int& d9 = d7; }
③引用作參數:
1.【值傳遞】如果形參為非引用的傳值方式,則生成局部臨時變量接收實參的值 void Swap (int left, int right) //值傳遞的方式無法實現交換,因為傳參時對於參數left和right拷貝一臨時副本,交換的是副本值,因為其是臨時變量函數退出,變量銷 { //毀,並不會影響外部left和right的值。 int temp = left; left = right ; right = temp ; } 2.【引用傳遞】如果形參為引用類型,則形參是實參的別名。 void Swap (int& left, int& right)//使用引用的話,不做臨時拷貝,&的使用說明此處只是原參數的另一個名字而已,所以修改時直接在原參數的基礎上修改變量值,減少了復制的開銷,加快程序執行效率。 { int temp = left; right = left ; left = temp ; } 3.【指針傳遞】 void Swap (int* pLeft, int* pRight)//傳入的是地址,因為地址是唯一的,所以指針通過地址的訪問進而可修改其內容。 { int temp = *pLeft; *pLeft = *pRight; *pRight = temp; }
引用的優點:
1、函數參數。引用傳遞比值傳遞效率高。
2、函數返回值。
(1)返回的變量生命周期要大於函數的生命周期;
(2)不能返回局部變量;
(3)不要輕易返回堆空間,防止內存泄漏。
註意:
(1)若返回棧變量,不能成為其他引用的初始值,不能作為左值使用。
(2)若返回靜態變量或者全局變量,可以成為其他引用的初始值,可以作為左值或者右值使用。
引用雖方便,使用須謹慎:
(1)&在這裏不是求地址運算,而是起標識作用。
(2)類型標識符是指目標變量的類型。
(3)聲明引用時,必須同時對其進行初始化,不能設為NULL。
(4)引用聲明完畢後,相當於目標變量名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變量名的別名。
(5)對引用求地址,就是對目標變量求地址。即引用名是目標變量名的一個別名。引用在定義上是說引用不占據任何內存空間,但是編譯器在一般將
其實現為const指針,即指向位置不可變的指針,所以引用實際上與一般指針同樣占用內存。
(6)不能建立引用的數組。因為數組是一個由若幹個元素所組成的集合,所以無法建立一個由引用組成的集合,但是可以建立數組的引用。
(7)引用常見的使用用途:作為函數的參數、函數的返回值。
總結:
1. 不要返回一個臨時變量的引用。
2. 如果返回對象出了當前函數的作用域依舊存在,則最好使用引用返回,因為這樣更高效。
* 引用和指針的區別和聯系(筆試熱點)
1. 引用只能在定義時初始化一次,之後不能改變指向其它變量(從一而終);指針變量的值可變。
2. 引用必須指向有效的變量(不能為NULL),指針可以為空。
3. sizeof指針對象和引用對象的意義不一樣。sizeof引用得到的是所指向的變量的大小,而sizeof指針是對象地址的大小。
4. 指針和引用自增(++)自減(--)意義不一樣。
5. 相對而言,引用比指針更安全。
指針比引用更為靈活,但是其風險也很大。使用指針時一定要檢查指針是否為空(NULL),且空間回收後指針最好置
零,以免野指針的發生造成內存泄漏等問題。
引用和指針的區別和聯系:
★不同點:
1. 指針是一個實體,而引用僅是個別名;
2. 引用使用時無需解引用(*),指針需要解引用;
3. 引用只能在定義時被初始化一次,之後不可變;指針可變;
4. 引用沒有 const,指針有 const;const修飾的指針不可變;
5. 引用不能為空,指針可以為空;
6. “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的地址)的大小;
7. 指針和引用的自增(++)運算意義不一樣;
8.從內存分配上看:程序為指針變量分配內存區域,而引用不需要分配內存區域。
★相同點:
兩者都是地址的概念,指針指向一塊兒內存,其內容為所指內存的地址;引用是某塊兒內存的別名。
C++之引用&的詳解