在什么时候需要使用“常引用”?

来源:互联网 发布:mac如何修改hosts文件 编辑:程序博客网 时间:2024/04/29 19:44

在什么时候需要使用“常引用”?

2014年10月27日 ⁄ 综合 ⁄ 共 2061字 ⁄ 字号 小 中 大 ⁄ 评论关闭
<iframe id="iframeu1788635_0" src="http://pos.baidu.com/vclm?rdid=1788635&amp;dc=2&amp;di=u1788635&amp;dri=0&amp;dis=0&amp;dai=2&amp;ps=236x908&amp;dcb=BAIDU_SSP_define&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1476179819863&amp;ti=%E5%9C%A8%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E9%9C%80%E8%A6%81%E4%BD%BF%E7%94%A8%E2%80%9C%E5%B8%B8%E5%BC%95%E7%94%A8%E2%80%9D%EF%BC%9F%20%7C%20%E5%AD%A6%E6%AD%A5%E5%9B%AD&amp;ari=2&amp;dbv=2&amp;drs=1&amp;pcs=1364x589&amp;pss=1364x256&amp;cfv=0&amp;cpl=5&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1476179819&amp;rw=589&amp;ltu=http%3A%2F%2Fwww.xuebuyuan.com%2F2195805.html&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Dr94_79NhStTsc4R3RYdDUePRp8C3deB4MwxWlTYRry6EXM-Nekq2y6TYcz7A-uIE%26wd%3D%26eqid%3D8d182460000039660000000257fcb767&amp;ecd=1&amp;psr=1366x768&amp;par=1366x728&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=7&amp;col=zh-CN&amp;cdo=-1&amp;tcn=1476179820&amp;qn=8f5e90291709f0d6&amp;tt=1476179819700.242.884.886" width="336" height="280" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="margin: 0px; padding: 0px; border-width: 0px; border-style: initial; background: transparent; vertical-align: bottom;"></iframe>

在什么时候需要使用“常引用”? 

    如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;

    例1

    int a ;
    const int &ra=a;
    ra=1; //错误
    a=1; //正确

    例2

    string foo( );
    void bar(string & s);

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

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

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

    引用型参数应该在能被定义为const的情况下,尽量定义为const 。

    5. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?

    格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }

    好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!

    注意事项:

    (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。

    (2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。

    (3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。

0 0
原创粉丝点击