1. 程式人生 > >C++之引用&的詳解

C++之引用&的詳解

ID 發生 AS res 函數返回 clas -c AD 數組

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++之引用&的詳解