「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
🌈引用
🌈介绍
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
- 给变量起别名
- 基本语法:数据类型 &别名=原名
int main(){
double m=100;//声明简单的变量
double &n=m;//声明引用变量
}
🌈注意事项
- 引用必须初始化
- 引用初始化后,就不可更改
#include<iostream>
using namespace std;
int main(){
//int &d;错误,未初始化
int a=10;
int &b=a;
int c=20;
b=c;//表示赋值操作,不是更改引用
}
🌈引用与指针
引用很容易与指针混淆,它们之间有三个主要的不同:
- 不存在空引用,引用必须连接到一块合法的内存,即引用要初始化。但存在空指针
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
🌈本质
引用的本质在C++内部实现是一个指针常量
解释如下:
int a=10;
int &b=a;
编译器自动转换为int *const b=&a,指针常量是指针指向不可改,也说明为什么引用不可更改。
对b赋值时:b=20;
内部发现b是引用,自动转换为b=20。
🌈做函数参数
- 函数传参时,可以利用引用让形参修饰实参
- 简化指针修改实参 下面以函数实现两数交换示例:
void swap01(int *x,int *y)//地址传递
{
int temp=*x;
*x=*y;
*y=temp;
}
void swap02(int &x,int &y)//引用传递
{
int temp=x;
x=y;
y=temp;
}
int main(){
int a=10;
int b=20;
swap01(&a,&b);//地址传递,形参会修饰实参
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
int a2=30;
int b2=40;
swap02(a2,b2);//相当于int &x=a2;int &y=b2;
cout<<"a2="<<a2<<endl;
cout<<"b2="<<b2<<endl;
}
🌈做函数返回值
- 可以作为函数的返回值存在的
- 不要返回局部变量
- 如果函数的返回值是引用,这个函数调用可作为左值
int &test01(){
int n=10;//局部变量放在栈区
return n;
}
int main(){
int &b=test01();
cout<<"b="<<b<<endl;//第一次正确,是因为编译器做了保留
cout<<"b="<<b<<endl;//之后错误,是因为a的内存已释放
}
int &test02()
{
static int a=10;//静态变量,存放在全局区,全局区上的数据在程序结束后系统释放
return a;
}
int main(){
int &b2=test02();
cout<<"b2="<<b2<<endl;
cout<<"b2="<<b2<<endl;//输出都为10
cout<<endl;
test02()=20;//a=20;b2是别名所以下面b2赋值为20;
cout<<"b2="<<b2<<endl;
}
🌈常量引用
- 常量引用主要用来修饰形参,防止误操作
- 在函数形参列表中,可以加const修饰形参,防止形参改变实参
//int &b=10;错误,引用本身需要一个合法的内存空间
const int &b=10;//加入const修饰,创建一个临时变量10,引用指向临时变量
//b=20;错误,const 修饰后变为只读,不可以修改别名
void test03(const int&b)
{
//b=20;//const修饰,形参不可修改
cout<<"b="<<b<<endl;
}
int main()
{
int a=10;
test03(a);
cout<<"a="<<a<<endl;
}
✍写在最后:大一上感觉就学了点C++的简单语法,接下来要慢慢的深入学习下C++啦,并且要练习用C++多刷题呀,作为计算机学习接触的第一门语言,希望自己能越来越熟练这门语言,加油啦记得坚持。😉😉