【C++基础】引用
一、引用的基本使用
给变量别名
语法:数据类型 &别名 = 原名;
(别名与原名的地址相同,指向的值也是同一个)
通过别名修改值,原变量的值也会修改。
示例:
#include<iostream>
using namespace std;
void main()
{
int a = 10;
int& b = a;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << endl;
b = 100;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
输出:
看看地址:
结果:
地址果然一样。
不知道这个别名图个啥。
二、引用注意事项
- 引用必须初始化
- 引用在初始化后,不可以改变(指不能改指向的地址,值还是可以改的)
示例:
1.引用必须初始化
不然报错
2.引用在初始化后,地址不能改
三、引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修改实参
优点:可以简化指针修改实参
示例:
#include<iostream>
using namespace std;
//1、值传递 不会修改实参
void function1(int a ,int b)
{
a *= 3;
b *= 3;
cout << "function1 : a = " << a << "\tb = " << b << endl;
}
//2、地址传递 会修改实参
void function2(int* a, int* b)
{
*a *= 3;
*b *= 3;
cout << "function2 : a = " << *a << "\tb = " << *b << endl;
}
//3、引用传递 会修改实参
void function3(int& a, int& b)
{
a *= 3;
b *= 3;
cout << "function3 : a = " << a << "\tb = " << b << endl;
}
void main()
{
int a = 11;
int b = 22;
cout << "传参前 : a = " << a << "\tb = " << b << endl;
function1(a,b);
cout << "传参后 : a = " << a << "\tb = " << b << endl;
cout << endl;
cout << "传参前 : a = " << a << "\tb = " << b << endl;
function2(&a, &b);
cout << "传参后 : a = " << a << "\tb = " << b << endl;
cout << endl;
cout << "传参前 : a = " << a << "\tb = " << b << endl;
function3(a, b);
cout << "传参后 : a = " << a << "\tb = " << b << endl;
cout << endl;
}
输出:
四、引用做函数返回值
不要返回局部变量的引用
用法:函数调用作为左值
示例:
#include<iostream>
using namespace std;
//返回局部变量引用
int& function1(int a) //形参在函数执行完后会被释放
{
return a += 1;
}
//传地址变量引用
int& function2(int* a) //地址作为传参,函数会修改实参
{
return *a += 1;
}
//静态变量引用
int& function3()
{
static int s = 10; //静态变量,存放在全局区,全局区上的数据在程序运行结束后由系统释放
return s;
}
void main()
{
int a = 1;
int& b = function1(a);
cout << "function1:" << endl;
cout << "\t" << b << endl;
cout << "\t" << b << endl;
int& c = function2(&a);
cout << "function2:" << endl;
cout << "\t" << c << endl;
cout << "\t" << c << endl;
int& s1 = function3();
cout << "function3:" << endl;
cout << "\t" << s1 << endl;
cout << "\t" << s1 << endl;
}
输出:
疑问:
- 不使用引用为什么形参值可以传递出来?
- 直接cout引用函数会不会返回形参值?
示例5:
int function(int a) //形参在函数执行完后会被释放
{
return a+=1;
}
void main()
{
int a = 1;
int b = function(a);
cout << "b = " << b << endl;
cout <<"function(a):" << function(a) << endl;
}
输出:
- 为什么
b = 2
?
b是一个新的容器,用来存储函数传出来的形参的值,所以函数将形参销毁,并不影响b的值。 引用时(int& b = function(a)
),b存储的是形参的地址,function(a)函数在运行完时,将形参的值销毁了,也就是吧b指向地址的值给销毁了。所以会引用不能传形参(局部变量同理)。 - 为什么
function(a) = 2
?
可能在执行cout << function(a) << endl;
时function(a)
的值被系统自行创建的一个新容器存储了。
又来一个疑问
为什么不能是执行cout << function(a) << endl;
时function(a)
的形参未被销毁?
为了测试形参是否被销毁,将函数换成返回引用int& function(int a)
其余代码不变:
示例:
输出:
通过查看输出判断:
- 如果使用
int b = function(a);
来接受引用地址,b似乎会直接被赋予引用地址的值,也就是直接赋值2。 - 第二行
function(a):-74305584
,说明形参的值确定被销毁了(这就是不能引用局部变量的原因)。 - 第三行
function(a):000000DA5836F510
是形参的地址。
所以在示例5中执行cout << function(a) << endl;
时function(a)
的值是被系统自行创建的一个新容器存储了。而不能是执行cout << function(a) << endl;
时function(a)
的形参未被销毁
五、引用的本质
本质:一个指针常量
六、常量引用
修饰形参,防止函数通过形参修改实参。