第一部分 基本语言 第二章 变量和基本类型(2.5引用)

2.5引用:

引用就是对象的别名,在程序中引用主要用作函数行参。引用是一种复合类型,是另一种类型定义的类型。在引用情况下,每一种引用都关联到某一其他类型。不能定义引用的引用类型,但可以定义任何其他类型的引用。


一、引用必须与该引用同类型的对象初始化。定义引用时必须初始化。

int ival=1024;

int &rval=ival;//正确

int &rval;//错误,定义引用类型时必须初始化。

int &rval=10;//错误,初始化引用类型必须用同类型对象初始化。

二、引用是别名:

引用是绑定对象的另一个名字,作用在引用上的结果都会关联到该引用绑定的对象上。引用初始化定义之后不可更改绑定对象,对于变量所表示的那块内存,既可以通过变量名访问,也可以通过引用访问,两者访问的都是同一块内存,所以无论是作用在变量名还是在引用上的操作都会对内存产生更改。


三、定义多个引用:


可以在一个类型定义中定义多个引用,一个对象也可以定义多个引用。

程序示例:

#include <iostream>


using namespace::std;


int g;


int main ()

{

int i=1024,i2=2048;

int &r=i,r2=i2;

int i3=1024,&ri=i3;

int &r3=i3,&r4=i2;

r4=5;

cout<<"i2: "<<i2<<" "<<"r2: "<<r2<<endl;

}

输出结果:

i2: 5 r2: 2048


具体情况如下


1、r3与ri同时都是i3的引用,修改其中任意一个都会对i3的值产生影响。

2、r4是i2的引用,i2将值付给r2,这时候修改r4,会对i2产生影响,但并不会对r2的值产生影响。赋值定义在引用修改对像之前不改变r2,但赋值定义如果在引用修改对象之后要改变被赋值对象的值。


四、const引用:

const引用是对const对象的引用,另外const对象如果要定义引用的话只能定义const引用。如果将const对象定义一个非const引用就会报错,因为非const引用可以修改绑定对象,而const是只读型类型,不能被修改。所以报错。而将引用定义成const,也就不能通过修改引用来修改const对象,保护了const对象。

const对象定义引用必须是const引用,但const引用却能初始化为不同类型(相关联)的对象,同样的初始化对于非 const对象是非法的(引用初始化必须要是同类型)

当const引用绑定到不同类型的对象时,编译器会生成临时变量来转化不同类型,将引用绑定到转化后的临时变量上。注意:转化后遵循强制类型转化规则。精度有可能缺失。


程序示例:

#include <iostream>


using namespace::std;


int g;


int main ()

{

double dval=3.14;

constint &a=dval;

cout<<"dval: "<<dval<<" "<<"a: "<<a<<endl;

}

输出结果:

dval: 3.14 a: 3


通过const引用并不能修改绑定对象,const为只读类型引用。





习题解答:

1、下列那些定义非法,为什么,如何改正?

int ival=1.01;

int &rvall=1.01;

int &rval2=ival;

constint &rval3=1;


答:1、非法,将浮点数赋值给整形会导致精度缺失。

2、非法,将字面值常量赋给引用型类型。

3、合法,类型相同。

4、合法,可以将字面值常量赋给const引用。

2、在上题给出的定义下,下列那些赋值是非法的,如果赋值合法,解释赋值的作用。

ival2=3.14159;

rval2=rval3;

ival=rval3;

rval3=ival;

答:1、合法,将ival的值修改为3.14159.

2、合法,const引用可以作为右值。

3、合法,将ival赋值为1.

4、非法,rval3是const类型,不能接受赋值。

3、(a)中的定义和(b)中的赋值存在那些不同?哪些是非法的?

(a)

int ival=0;

constint &ri=0;

(b)

ival=ri;

ri=ival;

答:定义存在初始化的过程,赋值是刷新内存中的值。(b)中第二条非法,将值赋给const引用。
4、下列代码输出什么?

int i,&ri=i;

i=5;ri=10;

std::cout<<i<<" "<<ri<<std::endl;

答:10,10

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值