3引用
3.1引用的基本使用
作用:给变量起别名
语法:数据类型 &别名=原名
#include<iostream>
using namespace std;
#include<string>
int main() {
int a = 10;
int& b = a;//给变量a起别名
cout << "a= " << a << endl;
cout << "b= " << b << endl;
b = 100;//利用别名修改内存后重新打印
cout << "a= " << a << endl;
cout << "b= " << b << endl;
system("pause");
return 0;
}
程序输出结果为a=10;b=10;a=100;b=100
引用就是刚开始我定义了一块内存,我用变量a表示它,但是我现在又想再利用另一个变量b来表示,这种是允许的,这种方式就是引用,并且我无论是利用原名还是别名都可以修改内存中的值。
3.2引用的注意事项
引用必须初始化,引用在初始化后不可以改变。
引用初始化意思就是我们得先有a这种原名,再定义别名b,不能在没有a的时候就定义别名b;
初始化不能改变,就是引用要从一而终,当我们已经将b当作a的别名,不能再变成c的别名。
#include<iostream>
using namespace std;
#include<string>
int main() {
//int& b;//错误,需要先初始化
int a = 10;
int& b = a;//给变量a起别名
cout << "a= " << a << endl;
cout << "b= " << b << endl;
int c = 20;
b = c;//这行代码没错,但这是赋值操作,不是引用操作,就是单纯的把b修改成20
cout << "a= " << a << endl;
cout << "b= " << b << endl;
cout << "c= " << c << endl;
system("pause");
return 0;
}
3.3引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
#include<iostream>
using namespace std;
#include<string>
//1、值传递
void myswap01(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "swap01a= " << a << endl;
cout << "swap01b= " << b << endl;
}
//2、地址传递
void myswap02(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
cout << "swap02a= " << a << endl;
cout << "swap02b= " << b << endl;
}
//3、引用传递
void myswap03(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
cout << "swap03a= " << a << endl;
cout << "swap03b= " << b << endl;
}
int main() {
int a = 10;
int b = 20;
myswap03(a, b);
cout << "a= " << a << endl;
cout << "b= " << b << endl;
system("pause");
return 0;
}
在上述三种函数中,值传递中形参变化不会改变实参,其余两种都会;别名可以和原名一样
引用传递结果和地址传递一样,语法更简单
3.4引用做函数返回值
作用:引用是可以作为函数返回值存在的
注意:不要返回局部变量引用
用法:函数调用作为左值
#include<iostream>
using namespace std;
#include<string>
//1不要返回局部变量的引用
int& test01()
{
int a = 10;//局部变量存放在四区中的栈区
return a;
}
//2 函数的调用可以作为左值
int& test02()
{
static int a = 10;//静态变量,存放在全局区,全局区上的数据在程序结束后释放
return a;
}
int main() {
//int& ref = test01();
//cout << "ref= " << ref << endl;//第一次结果正确是因为编译器对数据进行了保留
//cout << "ref= " << ref << endl;//第二次结果错误,是因为a已经被释放
int& ref2 = test02();
cout << "ref2= " << ref2 << endl;
cout << "ref2= " << ref2 << endl;//结果一直正确,因为a没有被释放
test02() = 1000;//如果引用作为函数返回值,可以作为左值存在,本质就是把a改成1000,然后ref2在利用别名的方式访问
cout << "ref2= " << ref2 << endl;
cout << "ref2= " << ref2 << endl;//四行结果分别为10 10 1000 1000
system("pause");
return 0;
}
3.5引用的本质
引用的本质在c++内部实现是一个指针常量
int a=10;
int &ref=a;//编译器会自动转换成int* const ref=&a,指针常量是指针指向不能变,也就是为什么引用不可改变
ref=20//自动转换成*ref=20;
3.5常量引用
作用:用来修饰形参,防止误操作