引用的基本語法
-
用途起別名
-
Type &別名=原名
-
引用必須初始化
-
一旦初始化后,不能修改
-
對數組建立引用
#include<iostream>using namespace std;//1.引用基本語法 Type &別名=原名void test01(){int a = 10;int &b = a;cout << "a=" << a << endl;cout << "b=" << b << endl;}//2.引用必須初始化void test02(){//int &a; 必須初始化int a = 10;int &b = a; //引用初始化后不可修改int c = 20;b = c; //這個不叫初始化叫賦值cout << "b=" <<b<< endl;}//3.對數組建立引用void test03(){int arr[10];for (int i = 0; i < 10; i++){arr[i] = i;}//給數組起別名int(&pArr)[10] = arr;for (int i = 0; i < 10; i++){cout << pArr[i] << " ";}cout << endl;//第二種方式起別名typedef int(ARRAYREF)[10];//一個具有10元素的int類型的數組ARRAYREF & pArr2 = arr;for (int i = 0; i < 10; i++){cout << pArr2[i] << " ";}cout << endl;}int main(){//test01();//test02();test03();system("pause");return 0;}
參數3種傳遞方式
-
值傳遞
-
地址傳遞
-
引用傳遞
#include<iostream>using namespace std;void mySwap(int a, int b){int tmp = a;a = b;b = tmp;cout << "mySwap::a= " << a << endl;cout << "mySwap::b= " << b << endl;}void test01(){int a = 10;int b = 10;mySwap(a, b); //值傳遞cout << "a= " << a << endl;cout << "b= " << b << endl;}//地址傳遞void mySwap2(int *a,int *b){int tmp = *a;*a = *b;*b = tmp;}void test02(){int a = 10;int b = 20;mySwap2(&a, &b); //地址傳遞cout << "a= " << a << endl;cout << "b= " << b << endl;}//引用傳遞 類似傳地址void mySwap3(int &a, int &b)//&a=a{int tmp = a;a = b;b = tmp;}void test03(){int a = 10;int b = 20;mySwap3(a, b); //值傳遞cout << "a= " << a << endl;cout << "b= " << b << endl;}//引用的注意事項//1.引用必須引用一塊合法的內存空間//2.不要返回局部變量的引用//3.不能有NULL引用,必須是合法內存空間//4.必須在聲明引用變量時進行初始化int &doWork(){int a = 10; //a為局部變量,引用接受返回值,應該亂碼return a;}void test04(){//int &a = 10;引用必須引用一塊合法的內存空間int &ret = doWork();cout << "ret= " << ret << endl;//第一次10是編譯器做了優化//如果多次打印就不行cout << "ret= " << ret << endl;cout << "ret= " << ret << endl;cout << "ret= " << ret << endl;}int &doWork02(){static int a = 10;return a;}void test05(){int& ret = doWork02();//如果函數的返回值是引用,那么這個函數調用可以作為左值doWork02() = 1000;//相當于a=1000cout << "ret= " << ret << endl;cout << "ret= " << ret << endl;cout << "ret= " << ret << endl;cout << "ret= " << ret << endl;}int main(){//test01();//test02();//test03();//test04();test05();system("pause");return 0;}
注意事項:
- 不要返回局部變量的引用
- 如果函數返回值是引用,那么函數的調用可以作為左值
- 引用的本質就是一個指針常量
指針的引用
用一級指針引用可以代替二級指針
常量引用
- 使用場景,修飾形參為只讀,尤其是拷貝構造函數
- const int &a=10;會分配內存
- 引用不產生新的變量,減少形參與實參傳遞時的開銷
- 由于引用可能導致實參隨形參改變而改變,將其定義為常量引用可以消除這種副作用
- 如果希望實參隨著形參改變而改變,那么使用一般的引用,如果不希望實參隨著形參改變,那么使用常引用