什么时候该使用指针和引用

  引用是c++引入的新类型,所以c++引用的语义让很多新手颇为头疼。

  引用就是一个对象的别名。对于一个变量的引用进行操作,作用效果会直接反映到这个变量上。

  引用在声明的时候必须要初始化,否则编译器会提示错误,所以引用一定不为空。

      int i = 20;

      int& j = i;

      int& k; //错误,必须要初始化

      ++j;    //引用j本身不变,执行的是i++

      extern int& k; // ok,k在别的地方被定义

  另外,对引用进行取地址操作,返回的是引用指向的对象的地址。在一般的情况下,编译器不会为引用分配空间。编译器编译的时候,看到引用,只是在符号表里增加一个记号。

   引用作为类的member成员时,编译器会为它分配空间。

   引用的生命期就是它所引用的对象的生命期。加入一个对象失效了,那么它的引用必然会失效。所以在函数里返回一个局部对象的引用是很危险的。比如说:

   int&  func()

  {

      int i = 20;

      int& k = i;

      return k;   //返回一个局部对象的引用,函数调用后,k所以用的i已经失效。

   }

   记得以前面试的时候,遇到这样一个面试题:

   int*& 和 int&* 分别代表什么意思?

   很遗憾那时我第一次遇到这个问题,没有答上来。正确答案是:

   int*& 声明的是指向int型指针的引用,而int&*不是合法的声明。指向引用的指针是非法的,因为引用根本不占内存。

 

   相对于引用,指针的语义相对简单很多。回到本文的标题,什么情况下改用引用,什么情况下改用指针呢?

   由于引用的一旦初始化便不可修改的特点,如果你知道可以总是指向一个对象,一旦指向一个对象,便不需要修改的时候,可以选择引用。如果有可能指向,有可能不指向,那么要使用指针。

 

   另外,引用一般用于参数的传递,用来防止对象的拷贝带来的开销。用于传递对象参数时,建议使用引用。

   还有,为容器定义[]操作符是,返回的是引用。此时返回指针总是怪怪的。

 

   由于指针和引用有着不同的语义,所以大家在使用时,一定要明白语义上的差别,以免发生不必要的麻烦。

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值