1. 程式人生 > >c++的引用和指標

c++的引用和指標

c++的引用和指標

簡略分析c++的引用和指標之間的聯絡和區別。


  • 1.引用

引用:就是某一變數(目標)的一個別名,對引用的操作與對變數直接操作完全一樣。

引用的宣告方法:

型別識別符號 &引用名=目標變數名;

例:char ch;
char &rp=ch;

1) 引用僅是變數的別名,而不是實實在在地定義了一個變數,因此引用本身並不佔用記憶體,而是和目標變數共同指向目標變數的記憶體地址.
2) 表示式中的取地址符&不再是取變數的地址,而是用來表示該變數是引用型別的變數。
3) 定義一個引用時,必須對其初始化。

  1. 引用的應用
    引用的一個重要作用就是作為函式的引數。以前的C語言中函式引數傳遞是值傳遞,如果有大塊資料作為引數傳遞的時候,採用的方案往往是指標,因為這樣可以避免將整塊資料全部壓棧,可以提高程式的效率。但是現在(C++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引用。

(1)使用引用傳遞函式的引數,在記憶體中並沒有產生實參的副本,它是直接對實參操作;而使用一般變數傳遞函式的引數,當發生函式呼叫時,需要給形參分配儲存單元,形參變數是實參變數的副本;如果傳遞的是物件,還將呼叫拷貝建構函式。因此,當引數傳遞的資料較大時,用引用比用一般變數傳遞引數的效率和所佔空間都好。

(2)使用指標作為函式的引數雖然也能達到與使用引用的效果,但是,在被調函式中同樣要給形參分配儲存單元,且需要重複使用\”*指標變數名\”的形式進行運算,這很容易產生錯誤且程式的閱讀性較差;另一方面,在主調函式的呼叫點處,必須用變數的地址作為實參。而引用更容易使用,更清晰。

  如果既要利用引用提高程式的效率,又要保護傳遞給函式的資料不在函式中被改變,就應使用常引用。
2、常引用

  常引用宣告方式:const 型別識別符號 &引用名 = 目標變數名;

  用這種方式宣告的引用,不能通過引用對目標變數的值進行修改,從而使引用的目標成為const,達到了引用的安全性。
  如一下程式:

#include <stdio.h>
#include <iostream>
using namespace std;
void test_const();

int main(void){

   test_const();
   return 0;
}

void test_const(){
   int a=1;
   int &b=a;
   b=2;
   cout<<"a="<<a<<endl;//2
   int c=1;
   const int &d=c;
  //d=2;//編譯錯誤 error: assignment of read_only reference 'd'
    c=2;//正確
    cout<<"c="<<c<<endl;//
}

3、引用作為返回值

  要以引用返回函式值,則函式定義時要按以下格式:

    型別識別符號 &函式名 (形參列表及型別說明)

    { 函式體 }

  說明:

  (1)以引用返回函式值,定義函式時需要在函式名前加&

  (2)用引用返回一個函式值的最大好處是,在記憶體中不產生被返回值的副本。
  

引用總結

  (1)在引用的使用中,單純給某個變數取個別名是毫無意義的,引用的目的主要用於在函式引數傳遞中,解決大塊資料或物件的傳遞效率和空間不如意的問題。

  (2)用引用傳遞函式的引數,能保證引數傳遞中不產生副本,提高傳遞的效率,且通過const的使用,保證了引用傳遞的安全性。

  (3)引用指標的區別是,指標通過某個指標變數指向一個物件後,對它所指向的變數間接操作。程式中使用指標,程式的可讀性差;而引用本身就是目標變數的別名,對引用的操作就是對目標變數的操作

  (4)使用引用的時機。流操作符<<和>>、賦值操作符=的返回值、拷貝建構函式的引數、賦值操作符=的引數、其它情況都推薦使用引用。