引用&與const

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

引用的聲明方法
:類型標識符 &引用名=目標變量名

例如:int a; int &ra=a; //定義引用ra,它是變量a的引用

1.&在此不是求地址運算,而是起標識的作用

  1. 類型標識符是指目標變量的類型(一個變量可以有多個別名)

  2. 聲明引用時,必須同時對其進行初始化

  3. 引用聲明完畢後,相當於目標變量有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作爲其他變量名的別名。ra=1;等價於a=1;

  4. 聲明一個引用,不是新定義了一個變量,它只是表示引用名是目標變量的一個別名,它本身不是一種數據類型,因此引用本身不佔存儲單元,系統也不給引用分配存儲單元。因此:對引用求地址,就是對目標變量求地址。&ra與&a相等。

  5. 不能建立數組的引用。因爲數組是一個由若干元素所組成的集合,所以無法建立一個數組的別名。

引用可作爲參數,常引用,返回值等

引用作爲參數傳遞與指針傳參的比較:

(1)傳遞引用給函數與傳遞指針的效果是一樣的。這時,被調函數的形參就成爲原來主調函數中的實參變量或對象的一個別名來使用,所以在被調函數中對形參變量的操作就是對其相應的目標對象(在主調函數中)的操作。

  (2)使用引用傳遞函數的參數,在內存中並沒有產生實參的副本,它是直接對實參操作;而使用一般變量傳遞函數的參數,當發生函數調用時,需要給 形參分配存儲單元,形參變量是實參變量的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變量傳遞參數的效 率和所佔空間都好。

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

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

引用和指針的區別和聯繫:

不同點:

  1. 指針是一個實體,而引用僅是個別名;

  2. 引用使用時無需解引用(*),指針需要解引用;

  3. 引用只能在定義時被初始化一次,之後不可變;指針可變;

  4. 引用沒有 const,指針有 const;const修飾的指針不可變;

  5. 引用不能爲空,指針可以爲空;

  6. “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的地址)的大小;
  1. 指針和引用的自增(++)運算意義不一樣;

    8.從內存分配上看:程序爲指針變量分配內存區域,而引用不需要分配內存區域。

相同點:兩者都是地址的概念,指針指向一塊兒內存,其內容爲所指內存的地址;引用是某塊兒內存的別名。

const在C和C++中的含義

⑴C中的const,功能比較單一,較容易理解:
作用:被修飾的內容不可更改。
使用場合:修飾變量,函數參數,返回值等。(c++中應用場合要豐富的多)
特點: 是運行時const,因此不能取代#define用於成爲數組長度等需要編譯時常量的情況。同時因爲是運行時const,可以只定義而不初始化,而在運行時初始化。如 const int iConst;。 另外,在c中,const變量默認是外部鏈接,因此在不同的編譯單元中如果有同名const變量,會引發命名衝突,編譯時報錯。
⑵c++中的const:

a、非類成員const:

①const變量默認是內部連接的,因此在不同的編譯單元中可以有同名的const 變量定義。

②編譯時常量,因此可以像#define一樣使用,而且因爲上面一點,可以在頭文件中定義const變量,包含的不同的cpp文件(編譯

單元)中使用而不引起命名衝突。

③編譯器默認不爲const變量分配內存,除非:1. 使用 extern 申明, 2:程序中有引用const 變量的地址。

④c++中臨時對象/內置變量默認具有const屬性。

b、類中的const:

①與c語言中的const一樣,只是運行時常量,不能作爲數組維數使用,即不能取代#define。在類中使用下面兩種方式取代#define: 1:static const...

2 : enum{....}//enum 不佔存儲空間。

②類中的const 變量佔用存儲空間。

③類中的const成員變量需要在構造函數初始化列表中初始化。

④const 對象:在該對象生命週期內,必須保證沒有任何成員變量被改變。const對象只能調用const成員函數。

⑤const成員函數: void fun() const ... 不僅能被const對象調用,也能被非const對象調用,因此,如果確認一個任何成員函數不改

變任何成員變量,應該習慣性將該函數定義成const類型。

⑥如果一個對象被定義成const,那麼該const對象“可能”會被放入到ROM當中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章