DemoSteve的学习笔记:C++ 引用变量


前言

最近入手了一本《C++ Primer Plus》,准备好好学学C++,这一篇文章,我来讲讲读完以后我对引用变量的一些认识。

一、什么是引用变量?

”引用变量“是C++新增的一种复合类型,可以把它理解为一个变量的别名。他们拥有相同的值和内存单元,只是名字不一样而已。使用引用变量,我们就可以让函数直接使用原始数据,而不是像按值返回那样使用一个拷贝来的副本,所以引用在针对结构体或类这样的大型数据的时候是更加方便的。

在定义引用变量时需要在数据类型后加上&:

int mouse = 10;
int& rat = mouse;//rat作为引用变量,与mouse指向(共用)相同的值和内存单元  

需要注意的是:
1、这里的&并不是C语言中的取地址符号(当然C++也用&取地址),只是在数据类型后加上&就表示这是个引用。

2、在声明引用变量的时候必须对其进行初始化,且”=“右边应该为左值(左值一般来说就是有地址的变量,当然也可以用右值,这个我们后面来讲)
下列定义方法是错误的

int mouse=10;
int& rat;
rat = mouse;//我们不能这样定义

二、引用变量和指针

1.指针和C++的引用变量都能使变量指向原始变量的内存地址,不过引用变量更接近于const指针,因为指针仅仅是指向原始变量的内存地址,而引用变量更像是把自己和原始变量捆绑在了一起,它的内存地址始终和原始变量的内存地址一致,而且一旦作为某变量的引用,那么它就不能作为其他变量的引用。

int & rat = mouse; 相当于 int * const rat = &mouse;

2.我们当然可以弄一个指针的引用变量,去看看是否引用变量的地址,可以随指针的地址的改变而改变:

 int rat = 101;
 int* p = &rat;//指针指向变量rat
 int& mouse = *p;//mouse作为*P的引用变量
 cout << "p address=" << p << ",mouse address =" << &mouse << endl;
 int bunnies = 50;
 p = &bunnies;//改变指针p的指向
 cout << "p address=" << p << ",mouse address =" << &mouse << endl;

结果为:

p address=00CFFB4C,mouse address=00CFFB4C
p address=00CFFB28,mouse address=00CFFB4C

可以看到引用变量的值并没有随着指针地址的改变而改变,而是与引用时指针所指向的那个地址(也就是rat的地址)绑定了起来。

三、引用变量作为函数参数

1.按引用传递参数

我们在C中学习了按值传递参数,按指针传递参数,在C++中则新增了按引用传递参数,方法很简单。
示例:

void add(int& ft){
	ft+=1;
}
int main(){
	int y=1;
	cout<<add(y)<<endl;
	return 0;
}

2.临时变量、引用参数和const

前面说过引用在声明时,”=“右边应该为左值(可以被取地址的变量),但是C++11在实参与引用参数不匹配的情况下,会生成“临时变量”,且仅当参数为const &类型时才能这样做。这样能避免一些不必要的编码错误。
有两种情况能形成临时变量:
1.实参类型正确,但不是左值

const int& a = 10;//这是对的✔

2.实参类型不正确,但可以转换为正确类型

double xxx(const double& ft){
	return ft*ft*ft;//返回一个double类型的引用
}
int main(){
	int a = 11;
	cout<<xxx(a)<<endl;//这样是正确的
	cout<<sizeof(xxx(a))<<endl;//查看被该后的类型
}

结果为:

1331
8

由此可知,结果被强制类型转换为了double型。所以我们在使用引用定义函数参数的时候,最好是加上const,这样既可以避免修改代码后报错,又能处理const和非const实参,而且可以正确生成并使用临时变量。

总结

我这个算是一个简单的对引用的概述,如果还需要更深入的了解,建议大家去看看《C++ Primer Plus》这本书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值