C++学习笔记(三)(引用)

总结:引用的好处可以在函数调用的时候不产生副本。(特别是传递大数据的时候)

应用:

1.作为函数参数传入(大数据,对象传入时更省空间)

void swap(int &p1,  int &p2)  //此处函数的形参p1, p2都是引用 
{ int p;
  p=p1;  
  p1=p2;  
  p2=p; 
} 

(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

2.常引用

【例3】: 
int a ;
const int &ra=a;
ra=1;  //错误,不能通过引用对目标变量的值进行修改
a=1;  //正确 
writing into constant object
这不光是让代码更健壮,也有些其它方面的需要。

【例4】:假设有如下函数声明:
string foo( );
void bar(string & s);
那么下面的表达式将是非法的:

bar(foo( ));
bar("hello world");  

原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。

引用型函数参数在能被定义成const的情况下,尽量定义成const。

3.函数返回值为常引用

    (1)不能返回局部变量的引用。局部变量使用完后会被销毁,这时这个引用会变成空引用而有可能报错或者程序进入未知状态。

    (2)不能返回函数内部新new的对象。虽然不存在对象自动销毁,但是如果这个对象的引用只是个临时变量,之后没有实际意义,很难对其进行垃圾回收(delete操作),造成memory leak(内存泄漏)。

    (3)返回对类成员的引用。因为在有些类中,某一类的类成员往往是与其他对象的状态有关系的,这时这个类成员往往被封装在一个方法内部,若用指针或非常量值对其调用会显得不安全,此时应该返回该类对象的常量引用。(const type &)

 4.引用与多态

       若基类有虚函数,则其派生类中调用基类的引用,则会重写虚函数,进而构造多态。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值