引用

引用的概念及用法

引用:给一个已经定义了的变量重新起一个别名。
定义格式:
类型&引用变量名=已定义的变量名

引用原则

  1. 引用必须在定义的时候就给定引用对象,而且一个引用变量只能引用唯一的一个已经定义的变量。
  2. 一个变量可以有多个不同的引用变量。
  3. 引用变量也是变量,也可以被引用。
  4. 不允许创建引用的引用,也不能有指针的引用,不能建立数组的引用。
int a = 10;
int&&b = a;//错误
int& *p=&a;//错误

这里写图片描述

这里写图片描述

引用中的const

我们知道在C语言中const变量不能直接被修改,可以通过指针被修改,这个属性被称之为具有常属性的变量。而在C++中const修饰的数量就是常量。

int a = 10;int&b = a;
int a = 10;const int&b = a;
const int a = 10;const int&b = a;

以上三种均合法

const int a = 10;int&b = a;

const int a;中的a是常量,而定义的引用b是一个变量,不能给常量赋变量值。类似于int a=0;10=a;肯定是错误的语句。

引用这里的的const遵循以下原则

  • 非const变量在被引用时候,可以被const引用变量和非const引用变量引用;而const变量只能被const引用变量引用。

引用做函数参数

  1. 引用作为函数参数会比传值调用更加高效,因为传值存在值拷贝的代价。
  2. 会比传址调用更加安全,因为指针可以指向空,而引用必须有唯一确定的引用对象。
  3. 引用作为函数参数可以改变实例中的参数,因为它是变量的别名,如果不允许改变实例参数,可以在参数列表加const限定。
#include<iostream>

int Add(const int& a, const int& b)
{
	return a + b;
}
int main()
{
	int a = 80;
	int b = 20;
	std::cout<<Add(a, b)<<std::endl;
	system("pause");
}

这里写图片描述

引用做函数返回值

优点:函数结束之后,函数栈帧销毁,而引用变量在堆上申请,采用引用变量做返回值,更加安全。

#include<iostream>

int& Add(int& a, const int& b)
{
	a = a + b;
	return a;
}
int main()
{
	int a = 80;
	int b = 20;
	std::cout<<Add(a, b)<<std::endl;
	system("pause");
}

这里写图片描述

深层次看引用

引用的实质

这里写图片描述
引用和指针的底层实现是一样的,也就是说,定义一个变量a的引用变量b,在底层实际上就是定义了b变量存储了a的地址。而系统知道哪个是引用,哪个是指针,会根据它们各自的性质去执行各自允许执行的操作。

引用和指针的对比

  1. 定义:指针变量的内容是原变量的地址,调用原变量时候需要显示解引用调用;引用变量是原变量的别名引用的行为等同于原变量行为。
  2. 引用只能在变量定义时候初始化一次(从一而终),而指针变量的值可以更改。
  3. 引用必须指向有效的变量,而指针可以是空指针。
  4. sizeof(引用变量)等同于sizeof(原变量);sizeof(指针)是4或者8。
  5. 指针在使用时候,需要注意指针是否为空;释放指针所指向的地址时候,需要置空,否则可能存在野指针问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值