引用的特点和注意事项

引用,是变量的别名,就是你自己有个名字,比如李四,那你还有另外一个小名,叫小四,小四就是你的别名,别人叫你的时候你就会答应,那么李四和小四是同一个人,那么某个变量的引用是一样的,对该引用的操作就是对原变量的操作,本身不占用存储单元,也不是一个新的数据类型。(不能建立数组的引用)

引用在函数传参时的特点:

大家会经常见到类似于这样的函数形式:void func(int & a),以引用的方式传递参数,这种方式的好处有:

1. 不需要产生副本(一般的函数传递,eg:void func(int a),形参变量是实参变量的副本,如果传递的是对象的话,会调用复制构造函数),节省了内存空间;

2. 在被调函数func中对形参a的操作就是对实参变量的操作,直接更改实参变量;

3.可读性好,不用像指针那样*指针变量名。

顺便说一下引用和指针的区别和联系:
1. 对二者的操作均可以改变原变量;

2.引用不是一个数据类型,只是变量的别名,指针是一种数据类型,占用存储单元;

3.引用的可读性好,指针需要取变量符*。

常引用:

大家也会见到这样的形式:void func(const int & a)这种常引用方式是什么时候使用呢?看一个例子:

string foo( ); 

void bar(string & s); 

那么下面的表达式将是非法的:

 bar(foo( ));

 bar("hello world");

原因是:foo( )函数返回一个string类型的临时对象,这个对象是const型的,而bar()函数接收的是一个string类型的引用,但并不是常量,那么就是将const类型转换成非const类型,会报错, bar("hello world")也一样,会产生一个临时对象,这个对象同样是const类型的,bar函数定义为void bar(const string & s)就不会报错了。

引用使用的几点注意事项:

1. 不能返回局部变量的引用。因为局部变量在函数返回后会自动销毁,那么对应的引用就没有了指向,程序进入未知状态;

2. 不能返回new分配的内存空间的引用。因为如果该引用没有赋给一个实际变量,只是一个临时的变量的话,那么该引用所指向的存储空间就无法释放;

3. 当返回类成员的引用时,最好是const,因为对象的属性之间很可能有相关性;

4. 流操作重载运算符返回声明为引用,因为<<和>>常常被连续使用,如果返回的是对象或者对象指针时,程序会构造一个新的流对象,两个连续的<<指向的是不同对象的,所以必须返回引用。eg:(x=10)=100,如果x=10返回的是一个变量的话,那么100就赋给了这个临时变量,而不是x。

5. :+-*/ 四则运算符不能返回引用,因为他们不会产生副作用(表达式有两种功能:每个表达式都产生一个值( value ),同时可能包含副作用( side effect )。副作用是指改变了某些变量的值。),所以要返回一个对象,用这个对象去改变某些变量的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值