C++中的引用和const

引用(&)

引用是将一个变量声明为另一个变量的别名

int rats;
int &rodents = rats;

引用必须在声明变量时就进行初始化,而不能像指针那样,先声明,后初始化

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
int main()
{
	//freopen("C://input.txt", "r", stdin);
	int rats = 101;
	int &rodents = rats;

	cout << rats << endl;
	cout << rodents << endl;

	int bunnies = 50;
	rodents = bunnies;

	cout << rats << endl;
	cout << rodents << endl;
	return 0;
}

前两行输出都是101,后两行输出的是50,

虽然rodents的值被改变了,但是rodents的地址仍然与rats一样,而不是与bunnies一样

在交换变量时,按引用传递和按指针传递都可交换变量值,但是按值传递则不可以。

 

Const

如果实参和引用参数不匹配的情况下,使用const会产生临时变量,编译器产生临时变量的两种情况

1.实参类型正确,但不是左值

2.实参类型不正确,但是转换为正确的类型

左值:可被引用的数据对象,例如:变量。数组元素,结构成员,引用和解除引用的指针

非左值:字面常量(用括号引起的字符串除外,它们由其地址表示)和包含多项的表达式

double a(const double &ra)
{
	return ra*ra*ra;
}
long int edge = 7;
double c1 = a(edge);
double c2 = a(5.0);
double side = 2.0;
double c3 = a(side);

则c1,c2函数里面会产生临时变量,c3不是

但是这种情况只会对常量有用,也就是说对常量引用是可以的,但是对变量引用则是错误的。

比如:

void swapr(const int &a,const int &b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
long long int a = 3, b = 4;
swapr(a, b);

这种情况程序则会报错,而不是编译成功,因为类型不匹配

应尽可能的使用const

讲引用参数声明为常量数据的引用的理由有三个:

1.使用Const可以避免无意中修改数据的编程错误

2.使用const使函数能够处理const和非const的实参,否则将只能接受非const的数据

3.使用const引用使函数能够正确生成并使用临时变量

 

返回引用与传统返回的区别:传统返回机制是在return后面返回一个表达式或者值,并且将结果返回给调用函数

从概念上说:这个值先被复制到一个临时位置,调用函数使用这个值

例:double m = sprt(16.0),  值4.0先被复制到一个临时位置,后被赋值给m,而使用引用,则直接返回给调用函数,少了复制到临时位置这一步,效率更高

注:返回引用的函数实际上是被引用的变量的别名

在函数前加const只能作为右值,因为加const则是不可修改,所以不能作为左值

引用在内部存放的是对象的地址,他是该对象的别名,绑定后不可更改,指针可以

函数不能返回局部变量的地址或引用

const函数返回引用,不能返回临时变量,因为临时变量使用完后会释放掉内存,如果返回临时变量,则会运行到该位置时程序崩溃(可编译运行),错误:试图引用已经释放的内存。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值