一:引用
引用:引用不是定義乙個新的變數,而是給乙個已經定義的變數重新起乙個別名; 定義的格式為:型別& 引用變數名=已定義過的變數名
引用的特點:
1.乙個變數可以有多個別名
int a = 1;
int& b = a;
int& c = a;
int& d = b;
cout
<< &a << endl;
cout
<< &b << endl;
cout
<< &c << endl;
cout
<< &c << endl;
b = 4;
引用變數位址相同:
乙個引用變數改變,其餘變數都改變:
2.引用必須初始化
int a = 2;
int& c; //錯誤
3.引用只能在初始化時被引用乙個,不能改變為再引用其他的變數
int a = 2;
int b = 3;
int& c = a; //c是a的引用
c = b; //是賦值,將b賦給a
二:const引用
首先,了解const指標:
引用賦值用指標賦值一樣,只能縮小,即大範圍型別賦給同等型別或者小範圍型別。
三:引用作為引數
在函式傳參時,是將實參拷貝給形參:
如果形參是非引用的傳值方式,則生成區域性臨時變數接受實參的值;
如果形參是引用的傳值方式,則形參是實參的別名,即形參實參指向同一段空間,即不會拷貝;
如果實參是物件,且不用引用作為引數,會有一次拷貝構造。
void swap(int& a, int& b)
當不希望函式內改變實參值,可以使用常引用形參(const int&a)
四:傳值做返回值,傳&做返回值
由於函式呼叫結束,銷毀棧幀,當函式有返回值時,會將返回值拷貝給乙個臨時變數(系統會分配記憶體);即在乙個函式的內部,return的時候返回的都是乙個拷貝,不管是變數、物件還是指標都是返回拷貝,但是這個拷貝是淺拷貝。
int& add(int a, int b)//用引用返回
int &c = add(1, 2);//c是add函式返回值引用,即兩者共用一段空間
add(3, 4);
cout
<< c << endl;//7,所以對於臨時變數不要用&返回
引用返回時,當ret再次改變,解引用值也會改變。
結論:
1.不要返回乙個臨時變數的引用。
2.如果返回物件出了當前作用域依舊存在,則最好使用引用返回,可以減少一次拷貝構造,更高效。
引用和指標的區別和聯絡:
1.引用只能在定義時初始化一次,之後不能改變引用其他變數;而指標指向的值可變
2.引用必須指向有效的變數,指標可以為空
3.sizeof指標物件和引用物件的意義不同。sizeof引用得到的是所指向變數的大小,而sizeof指標是物件位址的大小
char a = 10;
char *p = &a;
cout << sizeof(p) << endl; //32位是4,64位是8
char& b = a;
cout << sizeof(b) << endl; //1
4.指標和引用++(–)意義不同,指標++是+所指型別大小,引用++就是+1
5.相對而言,引用比指標安全。因為指標需要判空,指標所指位址釋放後要置null,否則可能存在野指標問題。
請看下列**:
int* p = 0;
int b = 3;//有空位址
int& a = *p;
swap(a, b);//在這裡崩潰,因為a指向空位址,解引用空位址
引用,const引用,指標
引用,const引用,指標 一 引用 1 定義 引用不是定義乙個新的變數,而是給乙個已經定義的變數重新起乙個別名。2 宣告方法 型別 引用變數名 已定義過的變數名。3 特點 l 乙個變數可以取多個別名 但引用與其所代表的變數共享同一記憶體空間 模擬 人的別名 l 引用必須初始化,且必須宣告引用的型別...
指標和引用,const 指標和const 引用
指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...
指標 引用 const
宣告語句 基本資料型別 宣告符。宣告符命名了乙個變數並指定該變數為與基本資料型別有關的某種型別。一 引用 1.定義引用時,程式把引用和它的初始值物件繫結在一起,而不是把初始值拷貝給引用。無法令引用重新繫結到另外乙個物件。int ival 2 int refval ival 2.引用必須初始化,初始值...