C++引用以及引用和指针的区别

1. 什么是引用?
 引用就是某个变量的"别名"(alias),对引用的操作与对变量直接操作效果完全相同。申明一个引用的时候一定要初始化(故引用不会为空)。引用申明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能在把引用名作为其他变量的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名时目标变量的一个别名,它本身不是一种数据类型,因此引用不占存储单元,系统也不会给引用分配存储单元。
 
2. 不能建立数组的引用-->这句话的意思是我们不能建立一个数组元素是引用的数组,但是还是可以定义数组的引用的
 int a[3] = {10, 50, 100};
 int(&b)[3] = a; (合法)
不能建立数组的引用是说。数组的元素不能是引用。
而 int(&b)[3] = a; b本身是一个引用,不是数组,b的引用是数组名。
如果建立,数组的元素是引用的数组是:int & b[3];(不合法) 这样b是数组,数组中元素才是引用,但是nt & b[3];这样C++不支持,因为引用不能作为数组中的元素。
引用不可以作为数组元素的原因:他不支持传统意义的复制,其没分配内存存储单元。
int a = b;a和b在内存中分别占用,内容一致。 如果int &a = b;这种复制,内存中a并不分配新的内存。
 
3.引用作为函数参数的特点
(1)传递引用和传递指针效果是一样的。
(2)使用引用传递函数的参数,它在内存中并没有产生实参的副本,他是直接对实参操作,即节省内存。而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
(3)将引用作为函数返回值时在内存中不产生被返回值的副本故返回一个局部变量的引用是不可取的。可以返回类成员的引用,但最好是const
(4) 在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一 个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。
(5). "引用"与多态的关系
引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。
例4
Class A; Class B : Class A{...}; B b; A& ref = b;


4. 传递函数参数时使用指针和引用的区别
使用指针和引用作为函数的参数的实际效果是一样的
引用不能为空,但是指针可以为空,因此引用更安全不会出现空指针清空
引用是变量的别名,不会产生变量不占用内存,直接操作对象,指针还需要占用4个字节内存存储变量的地址,相当于间接操作变量

5. 什么时候需要"引用"?
流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值