C++Primer读书笔记之引用

引用就是对象的另一个名字,通过在变量名前添加“&”符号来定义,是一种复合类型。在实际程序中,引用主要用作函数的形式参数。

一.常规引用

注意:

1.声明引用时,必须同时对其进行初始化。
2.引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
3.声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

4.不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。

5.定义多个引用时,必须在每个引用标识符前添加“&”符号,如:(1)int i3 = 1024, &ri = i3(只定义了一个引用)(2)int &r3 = i3, &r4 = i2(定义了2个引用)。 

二.const 引用

严格来说,“const 引用”的意思是“指向 const 对象的引用”。类似地,程序员使用术语“非 const 引用”表示指向非 const 类型的引用

const int ival = 1024; 
const int &refVal = ival; // 正确
int &ref2 = ival; // 错误,没有指向一个常量对象


下面这种定义编译器会进行一些转换

double dval = 3.14; 
const int &ri = dval;
编译器会把这些代码转换成如以下形式的编码: 
int temp = dval; //创建一个临时变量 
const int &ri = temp; 

非 const 引用只能绑定到与该引用同类型的对象,const 引用则可以绑定到不同但相关的类型的对象或绑定到右值。



1.下列哪些定义是非法的?为什么?如何改正? 
(a) int ival = 1.01; (b) int &rval1 = 1.01; 
(c) int &rval2 = ival; (d) const int &rval3 = 1; 


答案:(b)错误。因为非 const 引用只能绑定到与该引用同类型的对象。

2.在上题给出的定义下,下列哪些赋值是非法的?如果赋值合法,解释赋值的作用。 
(a) rval2 = 3.14159; (b) rval2 = rval3; 
(c) ival = rval3; (d) rval3 = ival; 


答案:(d)非法,因为rval3是一个const 引用,所以不能赋值。

(a)将一个double 型的字面值赋给一个int 型变量,将会进行类型转换

(b)将1赋值给ival

(c)将1赋值给ival

3.(a) 中的定义和 (b) 中的赋值存在哪些不同?哪些是
非法的? 
(a) int ival = 0; (b) ival = ri; 
const int &ri = 0; ri = ival; 


答案: (a) int ival = 0 定义一个int 型变量并赋值为0 , const int &ri = 0 定义一个const 引用,并绑定到右值0上.

(b) ival = ri 将0赋值给ival ;  ri = ival,试图对ri 赋值,这是非法的,因为ri 是一个const 引用。


4.下列代码输出什么? 
int i, &ri = i; 
i = 5; ri =10; 
std::cout << i << " " << ri << std::endl; 


答案:10 10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值