在 C/C++ 中,我們將 char、int、float 等由語言本身支持的類型稱為基本類型,將數組、結構體、類(對象)等由基本類型組合而成的類型稱為聚合類型(在講解結構體時也曾使用復雜類型、構造類型這兩種說法)。引用(Reference)是 C++ 相對於C語言的又一個擴充。引用可以看做是數據的一個別名,通過這個別名和原來的名字都能夠找到這份數據。引用類似於 Windows 中的快捷方式,一個可執行程序可以有多個快捷方式,通過這些快捷方式和可執行程序本身都能夠運行程序;引用還類似於人的綽號(筆名),使用綽號(筆名)和本名都能表示一個人。
&取代了*,語法格式為:
type &name = data;
type 是被引用的數據的類型,name 是引用的名稱,data 是被引用的數據。引用必須在定義的同時初始化,並且以後也要從一而終,不能再引用其它數據,這有點類似於常量(const 變量)。
#include <iostream>
using namespace std;
int main(){
int a = 99;
int &b = a;
cout<<a<<", "<<b<<endl;
cout<<&a<<", "<<&b<<endl;
return 0;
}
運行結果:0x28ff44;或者說地址為0x28ff44的內存有兩個名字,a 和 b,想要訪問該內存上的數據時,使用哪個名字都行。&,在使用時不能添加&,使用時添加&表示取地址。如上面代碼所示,第 6 行中的&表示引用,第 8 行中的&表示取地址。除了這兩種用法,&還可以表示位運算中的與運算。
#include <iostream>
using namespace std;
int main(){
int a = 99;
int &b = a;
b = 47;
cout<<a<<", "<<b<<endl;
return 0;
}
運行結果:const type &name = value;
也可以是:type const &name = value;
這種引用方式為常引用
#include <iostream>
using namespace std;
void swap1(int a, int b);
void swap2(int *p1, int *p2);
void swap3(int &a, int &b);
int main(){
int num1, num2;
cout<<"Input two integers: ";
cin>>num1>>num2;
swap1(num1, num2);
cout<<num1<<" "<<num2<<endl;
cout<<"Input two integers: ";
cin>>num1>>num2;
swap2(&num1, &num2);
cout<<num1<<" "<<num2<<endl;
cout<<"Input two integers: ";
cin>>num1>>num2;
swap3(num1, num2);
cout<<num1<<" "<<num2<<endl;
return 0;
}
//直接傳遞參數內容
void swap1(int a, int b){
int temp = a;
a = b;
b = temp;
}
//傳遞指針
void swap2(int *p1, int *p2){
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
//按引用傳參
void swap3(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
運行結果:
#include <iostream>
using namespace std;
int &plus10(int &n){
n = n + 10;
return n;
}
int main(){
int num1 = 10;
int num2 = plus10(num1);
cout<<num1<<" "<<num2<<endl;
return 0;
}
運行結果:
#include <iostream>
using namespace std;
int &plus10(int &n){
int m = n + 10;
return m; //返回局部數據的引用
}
int main(){
int num1 = 10;
int num2 = plus10(num1);
cout<<num2<<endl;
int &num3 = plus10(num1);
int &num4 = plus10(num3);
cout<<num3<<" "<<num4<<endl;
return 0;
}
在 Visual Studio 下的運行結果:
20
-858993450 -858993450
20
30 30
20
30 0
20
20 30