C++中的引用

552 阅读2分钟

「这是我参与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++多刷题呀,作为计算机学习接触的第一门语言,希望自己能越来越熟练这门语言,加油啦记得坚持。😉😉