基本文法
作用 : 給變量起别名
文法:資料類型 &别名=原名
int a=10;
int &b=a;
b=20;
cout<<a<<endl;

改b,也相當于a,a,b一起綁定了
看到這個代碼的時候的深層了解
把它看成記憶體
可不可以讓b也代表這塊記憶體,就起個别名。
在C語言中可以用malloc
注意事項
int a=10;
int &b=a;
1.引用必須要初始化,要指派
2.引用一旦初始化後不可以更改
假如說又有一個變量
一旦b成為了a的别名,就不能再用c的别名了
引用做函數參數
作用:函數傳參時,可以利用引用的技術讓形參修飾實參
有點:可以簡化指針修改實參
#include<iostream>
using namespace std;
//交換函數
//值傳遞
void swap1(int a,int b){
int t=a;
a=b;
b=t;
}
//位址傳遞
void swap2(int *a,int *b){
int t=*a;
*a=*b;
*b=t;
}
//引用傳遞
void swap3(int &a,int &b){//括号裡的是起的别名,因為形參,和原來變量一樣的别名也可以
int t=a;//這個t就是個int型局部變量。
a=b;
b=t;
}
//引用與位址傳遞比較起來更簡便一點
int main(){
int a=10;
int b=20;
swap3(a,b);
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
引用做函數傳回值
作用
注意:
1.不要傳回局部變量的引用 因為局部變量會被編譯器釋放
#include<iostream>
using namespace std;
int & test(){
int a=10;//局部變量存放再四區中的棧區
return a;
}
int main(){
int &r=test();
cout<<r<<endl;
cout<<r<<endl;
return 0;
}
這點性質還是棧區的局部變量的性質
2.函數的調用可以作為左值
#include<iostream>
using namespace std;
int & test(){
static int a=10;//靜态變量存放在全局區 ,整個程式執行完才會被釋放
return a;
}
int main(){
int &r=test();
cout<<r<<endl;
cout<<r<<endl;
test()=1000;// 因為這個函數傳回的是a
cout<<r<<endl;
cout<<r<<endl;
return 0;
}
引用的本質
本質:引用的本質在C++内部實作是一個指針常量
#include<iostream>
using namespace std;
//發現是引用,轉換為int*const ref=&a;
//是以指針的本質就是一個指針常量
//引用一旦初始化後,就不可以發生改變
//但可以改變變量的值
int fun(int &ref ){
ref =100;
return ref; // ref是引用,轉換為*ref=100
}
int main(){
int a=10;
//自動轉換位int*const ref =&a;
//指針常量是指針指向不可改,也就說明了為什麼引用不能更改
int &ref=a;
ref=20;//内部發現ref是引用,自動幫我們轉換為*ref=20 ;
cout<<a<<endl;
cout<<ref<<endl;
return 0;
}
所有指針的操作編譯器都幫我們做了
常量引用
作用: 常量引用主要用來修飾形參,防止誤操作
在函數形參清單中,可以加const修飾形參,防止形參改變實參。
不用const的例子:
#include<iostream>
using namespace std;
void fun(int &ref ){
ref=100;
cout<<ref <<endl;
}
int main(){
int a=10;
//int &ref=a;
//int &ref=10;這個不對,引用必須引用一塊合法的記憶體空間
//加上const之後 編譯器将代碼修改 int temp=10; const int &ref =t;
const int &ref=10;
//ref=20;錯誤,加入const之後隻讀,不可修改
fun(a);
cout<<a<<endl;
return 0;
}
可見誤操作,改變了a的值
為了防止誤操作
void fun(const int &ref ){
// ref=100;這行會報錯。
cout<<ref <<endl;
}