引用的本质:
在C++内部:指针常量;
类似于:int *const s=&a;
const修饰,因此指针指向不可以改,但是其中的数据是可以改的;
引用的作用:起别名
语法:数据类型 &别名 = 原名
&:取地址符号
#include<iostream>
using namespace std;
int main(){
int a=10;
int &b=a;
cout<<"a:"<<a<<" a的地址为:"<<&a<<endl;
cout<<"b:"<<b<<" b的地址为:"<<&b<<endl;
return 0;
}
会发现,a,b的地址和值相同;
因此:可以认为两个名字(a,b)都指向同一个内存空间;
引用的注意事项:
1.引用必须初始化;
2.引用在初始化后,不可以进行改变;
#include<iostream>
using namespace std;
int main() {
int a = 10;
int c = 20;
int& b = a;
//int& b = c; 引用一旦初始化就不可以进行更改
//b=c; 此处叫做赋值操作,而不是更改引用
//int& c; 错误,必须初始化,因为c必须指向一个内存空间
cout << "a:" << a << " a的地址为:" << &a << endl;
cout << "b:" << b << " b的地址为:" << &b << endl;
return 0;
}
引用做函数参数:
函数传参的时候,可以利用引用的技术让形参修饰实参;
#include<iostream>
using namespace std;
void myswap1(int a, int b) {//值传递
int temp = a;
a = b;
b = temp;
cout << "swap:" << a << endl;
cout << "swap:" << b << endl;
}
void myswap2(int *a,int *b) {//指针传递
int tmp = *a;
*a = *b;
*b = tmp;
cout << "swap:" << *a << endl;
cout << "swap:" << *b << endl;
}
void myswap3(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
cout << a << " " << b<<endl;
}
int main() {
int a = 10;
int b = 20;
//myswap1(a,b);
//myswap2(&a, &b);
myswap3(a, b);
cout << a << " " << b << endl;
return 0;
}
引用做函数的返回值:
引用是可以作为函数的返回值存在的;
注意:
不要返回局部变量的引用,局部变量在函数结束后就被回收了,返回局部变量会造成错误;
函数的调用可以作为左值
#include<iostream>
using namespace std;
int& test1() {
int a=10;
return a;
}
int& test2() {
static int b = 10;
return b;
}
int main() {
/*int& s = test1();
cout << s << endl;//第一次编译器会帮忙保存,从而输出正确;
cout << s << endl;//非法操作*/
int& s = test2();
cout << s << endl;
cout << s << endl;
test2() = 1000;//函数作为左值
cout << s << endl;
system("pause");
}
test2()=1000;
解读:test2调用后,返回b的引用,相当于b=1000;而s又作为b的别名使用,因此输出了s为1000;
如果函数的返回值是引用,那么这个函数调用可以作为左值进行赋值,相当于别名进行赋值;