您的位置:首页 > 其它

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

2009-06-11 12:17 393 查看
引用是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&*不是合法的声明。指向引用的指针是非法的,因为引用根本不占内存。

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

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

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

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

由于指针和引用有着不同的语义,所以大家在使用时,一定要明白语义上的差别,以免发生不必要的麻烦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐