引用
- 引用的基本使用
- 注意事項
- 引用做函數參數
- 引用做函數傳回值
- 引用的本質
- 常量引用
引用的基本使用
作用:給變量起别名
文法:
資料類型 &别名=原名
int main() {
//引用基本文法
//資料類型 &别名 = 原名
int a = 10;
//建立引用
int &b = a;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
b = 100;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
别名和原名指向同一塊記憶體
修改别名或者原名,對應的原名和别名也會做相應修改
注意事項
- 引用必須初始化
- 引用在初始化後,不可以改變
int main() {
int a = 10;
//1、引用必須初始化
//int &b; // 錯誤,必須要初始化
int &b = a;
//2、引用在初始化後,不可以改變
int c = 20;
b = c; // 指派操作,而不是更改引用
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
return 0;
}
引用做函數參數
作用:函數傳參時,可以利用引用的技術讓形參修飾實參
優點:可以簡化指針修改實參
交換函數
- 1、值傳遞
- 值傳遞,形參不會修飾實參
void mySwap01(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10;
int b = 20;
mySwap01(a, b); //值傳遞 ,形參不會修飾實參
cout << "值傳遞時的交換結果:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
- 2、位址傳遞
- 位址傳遞,形參會修飾實參的
void mySwap02(int *a , int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 10;
int b = 20;
mySwap02(&a, &b); //位址傳遞,形參會修飾實參的
cout << "位址傳遞時的交換結果:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
- 3、引用傳遞
- 引用傳遞,形參會修飾實參
void mySwap03(int &a , int &b)
{
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10;
int b = 20;
mySwap03(a, b); //引用傳遞,形參會修飾實參的
cout << "引用傳遞時的交換結果:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
引用做函數傳回值
作用:引用是可以作為函數的傳回值存在的
注意:不要傳回局部變量引用
用法:函數調用作為左值
引用做函數的傳回值
- 1、不要傳回局部變量的引用
int& test01() 傳回值類型加上 & 相當于以 引用 的方式進行傳回
{
int a = 10; //局部變量存放在四區中的 棧區
return a;
}
int main()
{
int &ref = test01(); 建立一個引用 ref, 将 test01()的傳回值賦給 ref
cout << "ref = " << ref << endl; //第一次結果正确,是因為編譯器做了保留
cout << "ref = " << ref << endl; //第二次結果錯誤,因為a的記憶體已經釋放
return 0;
}
- 2、函數的調用可以作為左值
int& test02()
{
static int a = 10; 靜态變量,存放在全局區,全局區上的資料在程式結束後系統釋放
return a;
}
int main()
{
int &ref2 = test02();
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
test02() = 1000;
如果函數的傳回值是引用,這個函數調用可以作為左值
相當于 a = 1000; ,ref2 本身是 a 的别名,是以,ref2 也是1000
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
return 0;
}
引用的本質
本質:引用的本質在 C++ 内部實作是一個 指針常量
指針常量:指針的指向不可以改,指針指向的值可以改
C++學習筆記6: 指針.
// 發現是引用,轉換為 int * const ref = &a;
void func(int& ref)
{
ref = 100; // ref 是引用,轉換為 *ref = 100
}
int main()
{
int a = 10;
自動轉換為 int * const ref = &a; 指針常量是指針指向不可以改,也說明為什麼引用不可更改
int& ref = a;
ref = 20; // 内部發現 ref 是引用,自動轉換為 *ref = 20;
cout << "a: " << a << endl;
cout << "rerf:" << ref << endl;
func(a);
system("pause");
return 0;
}
結論:
C++推薦用引用技術,因為文法友善,引用本質是指針常量,
但是所有的指針操作編譯器都幫我們做了
常量引用
作用:常量引用主要用來修飾形參,防止誤操作
在函數形參清單中,可以加 const 修飾形參,防止形參改變實參
int a = 10;
int & ref = 10; // 錯誤。引用必須引一塊合法的記憶體空間
// 加上 const 之後,編譯器将代碼 修改為 int temp = 10; const int & ref = temp;
const int & ref = 10; // 正确。
ref = 20;// 錯誤,加上const之後變為隻讀,不可再更改
常量引用
用來修飾形參,防止誤操作
//列印資料函數
void showValue(const int &val)
{
//val = 1000;
形參加 const 不可再修改,防止誤操作
cout << "val = " << val << endl;
}
int main()
{
int a = 100;
showValue(a);
cout << "a = " << a << endl;
system("pause");
return 0;
}