<1>引用
1.什麼是引用?
答:引用不是定義一個新的變量,而是給一個已經定義的變量重新取一個別名。
2.引用的格式
類型&引用變量名=已經定義過的變量。
3.引用的特點
引用必須初始化
一個變量可以取多個別名(除const引用每個別名都可以修改這塊地址的值)
引用只能在初始化的時候引用一次,不能改變爲再引用其他的變量(例:b已經作爲了a的別名了則它不可以再作爲其他變量的別名了)
例:
<2>const引用
const引用就是不可以修改值的引用
例:
const int a = 10;
const int& b = a;
//因爲a是一個不可修改值的變量b作爲a的一個別名也必須是一個不可修改的引用(int& b=a則是一個錯誤的寫法)
const int& c = 20;
//int& c=20這也是一個錯誤的寫法因爲20是一個常量c作爲20的一個別名必須是const的引用
double m = 1.1;
const int& n =m;
//m是double類型的變量,n是int類型,m賦值給n時要生成一個臨時變量
//也就是說n引用的是這個具有常屬性的臨時變量,所以要用const引用
<3>引用作爲參數
1.【值傳遞】如果形參爲非引用的傳值方式,則生成局部臨時變量接受實參的值。
void Swap(int left,int right)//這個交換是不能實現的因爲這是形成的臨時變量的交換實參並不會發生交換
{
int tmp = left;
left = right;
right = tmp;
}
2.【引用傳遞】如果形參爲引用類型,則形參是實參的別名。
void Swap(int& left,int& right)//這個交換是可以實現的因爲引用傳參是別名是有權修改變量的值的
{
int tmp = left;
left = right;
right = tmp;
}
3.【指針傳遞】
void Swap(int* pleft,int* pright)
{
int tmp = *pleft;
*pleft = *pright;
*pright = tmp;
}
void Swap(int* pleft,int* pright)
{
int tmp = *pleft;
*pleft = *pright;
*pright = tmp;
}
<4>引用作爲返回值
例:
int& Add(int i, int j)
{
int ret = i + j;
return ret;
}
void main()
{
int a = 3;
int b = 4;
int c = Add(a, b);
cout << "c:" << c << endl;
}
int Add(int a,int b)
{
return a + b;
}
void Test()
{
int ret = Add(1, 2);
}
void main()
{
Test();
system("pause");
return;
}
通過彙編看函數棧幀調用
結論:
不要返回一個臨時變量的引用
如果返回對象出了當前函數的作用域依舊存在,則最好使用引用返回,因爲這樣更加高效
引用和指針的區別和聯繫
1.引用只能在定義時初始化一次,之後不能改變指向其它變量(從一而終);指針變量的值可以改變
2.引用必須指向有效的變量,指針可以爲空
3.sizeof指針對象和引用對象的意義不一樣。sizeof引用得到的是指向變量的大小,而sizeof指針是對象地址的大小
4.指針和引用自增(++)自減(--)意義不同;
5.相對而言引用比指針更安全
(指針比引用更加靈活,但是也更加危險。使用指針時一定要注意檢查指針是否爲空,指針所指的地址釋放以後最好置0,否則可能存在野指針問題)