1.引用的概念及用法引用不是定義乙個新的變數,而是給乙個已經定義的變數重新起乙個別名
定義的格式:型別 & 引用變數名 = 已定義過的變數名
引用的特點:
a)乙個變數可取多個別名
b)引用必須初始化
c)引用只能在初始化的時候引用一次,不能改變為再引用其他的變數
int& b = a; //為一塊已開闢的空間a取名為b(b是a的別名)
int* p = &a; //p指向空間a
int a = 10;
int& b = a; //b是a的別名
int i = 100;
b = i; //單純將i的值賦給b,b任然是a的別名,而此時a=b=100
const
int a = 10;
int& b =a;
顯然此時編譯器會報錯,原因是變數a用const修飾,具有常性,不能被修改。而此時a的別名b型別是int,可被修改,發生衝突,程式編譯出錯
此時應該將int& b=a;
改為const int& b = a;
。
類似的:
int& c = 20; //這樣表示是錯誤的。常量具有常性,只有常引用可以引用常量
const
int& c = 20; //正確表示方法
int d = 10;
float e = d; //存在隱式型別轉換
float& f = d; //錯誤
const
float& f = d; //正確
2.引用做引數
void swap(int& a, int& b)
int main()
結果為:
顯然傳引用同樣可以起到修改實參作用,此時形參是引用型別,形參是實參的別名,並未給形參開闢空間。同樣的用傳位址的方法傳參也可以起到修改實參的作用,但此時需給形參開闢空間。
結論:①引用傳參可以減少空間浪費
②引用傳參可以提高效率
若實參不想被修改,則可以用const修飾形參
void func(const big& big)
3.引用做返回值
①傳值返回
int add(int a, int b) //傳值返回
若用int& ret = add(10,20);
則會發生錯誤,因為函式返回的是臨時變數,具有常性,必須用const修飾,應改為const int& ret = add(10,20);
。
②傳引用返回
int& add(int a, int b)
int main()
結果為ret = 3
4.彙編層看引用的特性
語法上b是a的別名(不開闢空間),但底層是通過指標實現的(開闢了空間)。
結論:
1.不要返回乙個臨時變數的引用。
2.如果返回物件出了當前函式的作用域依舊存在,則最好使用引用返回,因為這樣更高效。
5.引用和指標的區別
引用與指標的區別和聯絡
⑴引用只能在定義時初始化一次,之後不能改變指向其他變數(從一而終);指標變數的值可變。
⑵引用必須指向有效的變數,指標可以為空。
⑶sizeof指標物件和引用物件的意義不一樣。sizeof引用得到的是所指向的變數的大小,而sizeof指標是物件位址的大小。
⑷指標和引用自增(++)自減(–)意義不一樣。
⑸相對而言,引用比指標更安全。
注:32位系統下指標一定為4個位元組
64位系統下與編譯器配置有關,工程建立後決定了指標的大小
有關越界的小常識:
越界不一定報錯
越界讀一般不報錯
如:
指標與引用
摘自 高質量c 程式設計 指標與引用,在more effective c 的條款一有詳細講述,我給你轉過來 條款一 指標與引用的區別 指標與引用看上去完全不同 指標用操作符 和 引用使用操作符 但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他物件。你如何決定在什麼時候使用指標,在什麼時候使用...
引用與指標
引用就是物件的另乙個名字,在實際的程式中,引用主要用作函式的形式引數。引用是一種復合型別,通過在變數名前新增 符號來定義。復合型別是指用其他型別定義的型別。在引用的情況下,每一種引用型別都 關聯到 某一其他型別。引用必須用與該引用同型別的物件初始化。當引用初始化後,只要該引用存在,它就保持繫結到初始...
指標與引用
include iostream using namespace std void testref int i 10 引用不可以為空,他是乙個物件的別名 int ref i ref cout i 00824f1e mov dword ptr i 1 把i的位址傳入eax 並把eax指標的位址傳給re...