什么时候该使用指针和引用
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&*不是合法的声明。指向引用的指针是非法的,因为引用根本不占内存。
相对于引用,指针的语义相对简单很多。回到本文的标题,什么情况下改用引用,什么情况下改用指针呢?
由于引用的一旦初始化便不可修改的特点,如果你知道可以总是指向一个对象,一旦指向一个对象,便不需要修改的时候,可以选择引用。如果有可能指向,有可能不指向,那么要使用指针。
另外,引用一般用于参数的传递,用来防止对象的拷贝带来的开销。用于传递对象参数时,建议使用引用。
还有,为容器定义[]操作符是,返回的是引用。此时返回指针总是怪怪的。
由于指针和引用有着不同的语义,所以大家在使用时,一定要明白语义上的差别,以免发生不必要的麻烦。
引用就是一个对象的别名。对于一个变量的引用进行操作,作用效果会直接反映到这个变量上。
引用在声明的时候必须要初始化,否则编译器会提示错误,所以引用一定不为空。
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&*不是合法的声明。指向引用的指针是非法的,因为引用根本不占内存。
相对于引用,指针的语义相对简单很多。回到本文的标题,什么情况下改用引用,什么情况下改用指针呢?
由于引用的一旦初始化便不可修改的特点,如果你知道可以总是指向一个对象,一旦指向一个对象,便不需要修改的时候,可以选择引用。如果有可能指向,有可能不指向,那么要使用指针。
另外,引用一般用于参数的传递,用来防止对象的拷贝带来的开销。用于传递对象参数时,建议使用引用。
还有,为容器定义[]操作符是,返回的是引用。此时返回指针总是怪怪的。
由于指针和引用有着不同的语义,所以大家在使用时,一定要明白语义上的差别,以免发生不必要的麻烦。
相关文章推荐
- 什么时候应使用指针形参?什么时候就使用引用形参?解释两者的优点和缺点。
- 什么时候使用指针?什么时候使用引用?什么时候应该按值传递?
- 什么时候使用值类型?什么时候使用引用类型?
- 指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
- C++异常对象传递的时候,使用普通对象还是指针还是引用(使用引用)
- 什么时候应该使用==?什么时候应该使用Equals?(如何判断值相等还是引用相等。)
- 指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
- linux下挂在u盘,移动硬盘的方法,转移服务器资料的时候,使用移动硬盘什么最方便了
- 什么时候应该使用Web Service
- 《面向对象程序设计与VC++实现》--Liwei_1_3 (交换 使用引用、指针、变量三种方法)
- 什么是对象的句柄?它是指针吗?它是引用吗?它是指向指针的指针?它是什么?
- 引用(别名)、取值和指针的区别使用
- 指针和引用的使用注意点-----常量指针和常量引用
- C++中使用指针、引用进行参数传递
- 101 数组在什么时候会转换为指针
- 什么时候应该使用Web Service
- C-036.字符数组与字符指针,它们的使用场景是什么?
- 什么是“引用”?申明和使用“引用”要注意哪些问题?
- 什么时候应该使用反射?
- 你不知道的事 之 C++ 指针和引用“是什么鬼”