1、引用就是给变量起一个别名。其本质就是一个指针常量(指针指向的地址不可以修改)
int a = 10;
// b 是a的别名。b和a所访问的内存是相同的
int &b = a;
2、注意事项:
- 引用在创建的时候必须要初始化。
- 引用一旦初始化就不可以再更改了。
3、引用作为函数的参数:
(1)、函数的参数传递可以为:值传递、地址传递、引用传递。 其中值传递不会改变原来的变量内容,其相当于将原来的变量进行复制;后两种传递方式都会改变原来变量中的内容,相当于直接操作原来变量中的内容。
#include<iostream>
using namespace std;
// 值传递
void swap01(int x,int y) {
int temp = x;
x = y;
y = temp;
}
// 地址传递
void swap02(int *p1, int *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
// 引用传递
void swap03(int &x,int &y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a = 10, b = 20;
//swap01(a, b);
swap02(&a, &b);
//swap03(a, b);
cout << "a= " << a << "\n" << "b= " << b << endl;
cin.get();
}
4、引用作为函数的返回值:
(1)、引用是可以作为函数的返回值
(2)、不要返回局部变量的引用
#include<iostream>
using namespace std;
int& func1() {
int a = 10; //a 为局部变量,存放在栈区中。
return a; // 返回a的引用
}
int main() {
int &ref = func1(); //当该函数调用完毕后,栈区中的局部变量就会被释放
cout << "ref = " << ref << endl; //第一次返回正确,因为编译器做了保留
cout << "ref = " << ref << endl; //第二次结果错误,因为a的内存已经释放了
cin.get();
}
(2)、函数的调用可以作为左值
#include<iostream>
using namespace std;
int& func1() {
static int a = 10; //静态变量存放在全局区,在程序运行结束之后才会释放
return a; // 返回a的引用
}
int main() {
int &ref = func1(); //此时ref相当于静态变量a的别名
cout << "ref = " << ref << endl;
cout << "ref = " << ref << endl;
func1() = 1000;// 此时函数的调用作为左值,
cout << "ref = " << ref << endl;
cout << "ref = " << ref << endl;
cin.get();
}
5、常量引用
(1)、常量引用主要用来修饰形参,防止误操作。
#include<iostream>
using namespace std;
// 保证传入的参数不被意外修改
void PrintValue(const int &a)
{
cout << a << endl;
}
int main()
{
int s = 10;
PrintValue(s);
cin.get();
}