什么是引用,如何区分引用和取地址符。

什么是引用:

引用是一种取名机制,它可以给变量重新取一新的名字,所以引用也叫别名。

理解了什么叫做别名,也就理解了引用,首先引用也可以是指针类型的引用

int b = 10;

int& a = b;       

cout<<a<<endl;        //结果就是10

在阅读完上面的代码后,不考虑指针与地址相关的知识,只要记住a就是b的别名,那么你就初步理解了引用。

---------------------------------------------------------------------------------------------------------------------------------

在另一个方面体现引用的意义就是在函数的使用中

#include <iostream>
using namespace std;

void func(int &a) //当调用func函数时,相当于int& a = b; 也就是给int类型的变量b创建了一个别名。
{

    a = 5678;
    cout << &a << " " << a << endl;
}

int main(int argc, const char *argv[])
{
    int b = 1234;
    int &a = b;

    func(b);
    cout << &b << " " << b << endl;
    return 0;
}

"如何使函数内的修改影响函数外的参数"这个问题在学习c的指针中同样被提出过,而c++这里就是使用了引用可以替换掉在这里使用指针。

引用的两大的意义与作用:

引用的第一个作用:跨函数共享变量,并且是否共享实参变量由函数的实现者决定,这种设计给了函数实现者权限,并且给了函数调用者方便。

#include <iostream>
using namespace std;

void func(int& dashixiong)	//这里相当于int& dashixiong = sunlingling; 也就是给int类型的变量sunlingling创建了一个别名。
{
    
    dashixiong = 5678;
    cout << &dashixiong << " " << dashixiong << endl;

}

int main(int argc,char* argv[])
{
    int sunlingling = 1234;
    int& dashixiong = sunlingling;
    
    func(sunlingling);
    cout << &sunlingling << " " << sunlingling << endl;
    return 0;
}

而第二个作用是提高函数的传参效率,默认情况下,函数传参单向值传递,变量有多少个字节就要拷贝多个字节的数据,而传递变量的地址,可以需要拷贝4字节的数据,而使用引用一个都不需要拷贝,用指针作为函数的参数也可以达到引用同样的效果,但是在被调函数中同样要给形参分配存储单元,所以引用比指针的传参的效率还要高。

#include <iostream>
using namespace std;

struct Data
{
	char str[20];
	int num;
	char ch;
};

void func(Data& d)
{

}

int main(int argc,char* argv[])
{
	Data d;
	for(int i=0; i<200000000; i++)
	{
		func(d);
		d.num++;
	}	
	return 0;
}

关于第二点只需要记住使用引用的性能优于指针即可。


引用的缺点:

  1. 可能导致悬空引用:

    • 如果引用在它所引用的对象被销毁后仍然被使用,就会导致悬空引用,这会导致未定义的行为。确保在引用离开其有效范围之前,其所引用的对象一直存在。
  2. 引用必须在初始化时被赋值:

    • 引用在声明的同时必须被初始化,而且不能在后续的代码中重新绑定到其他对象。这限制了引用的灵活性,因为它必须一开始就指向某个对象。
  3. 不支持空引用:

    • 引用不能像指针那样被显式赋值为 nullptr(C++11 及以后版本)或 NULL(之前的版本),因此无法表示空引用。这可能在需要表示对象可能不存在的情况下引发问题。

悬空引用

#include <iostream>
using namespace std;

int& func(void)
{
    int num = 1234;
    return num;		
}

int main(int argc,const char* argv[])
{
    int& b= func();
    cout << b<< endl;  
    return 0;
}

可以看到这里监视到b获取不到值。因为返回值是int类型的引用也就是int& value = num;这不是单纯的赋值行为,而是返回对num的引用,但又由于num的生命周期已经结束,所以造成了悬空引用。
 

引用与取地址符:

引用和取地址符的符号都是&,这两者极其容易搞混,但要分辨这两者只需记住一个原则:

在数据类型后使用&是引用,在变量前使用&即是取地址符。

在c++中有些人习惯在声明时会将引用加在变量名前方,这时候就需要结合上下文阅读,如:

void bubbleSortWithFlag(vector<int> &nums)

{

}

这样的写法对初学者而言可能会和下文中size_t value = &nums或者int* ptr =&nums搞混。

在c++中建议多使用引用来代替指针。

​​​​​​​

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值