c++中指针与引用的使用

先说结论

  1. 使用指针的情况:
  • 存在不指向任何对象的可能
  • 需要在不同的时刻指向不同的对象
  1. 使用引用:
  • 必须指向一个对象并且不会改变它的指向
  • 重载操作符时
它们的异同

  1. 相同点
  • 指针和引用的功能大致相同:间接引用其他对象
  1. 不同点
  • 表面上看上去完全不同
  • 指针操作符为:*->,引用操作符为:.
  • 指针可以为空,引用任何情况下不能为空。下面的代码会导致未定义的行为:
char *pc = 0;
char &rc = *pc; // 引用指向空值
  • 因为引用不能为空,所以引用应该被初始化,而指针没有这个要求(未初始化的指针不能直接使用,否则未定义的行为!)
  • 因为引用不能为空,所以使用引用前不需要测试它的合法性,效率比指针高(指针在使用前需要判断有效性)
  • 指针可以被重新赋值,以指向不同的对象,引用可以理解为初始化对象的别名,它总是指向在初始化时的对象,以后不能改变。如下代码示例:
string s1("foo");
string s2("bar");

string& rs = s1;
string *ps = &s1;

rs = s2; // rs仍引用s1,实际是把s2赋值给s1,所以s1现在的值是 bar
ps = &s2; // ps现在指向s2,s1保持不变
  • 重载操作符时,使用引用不会产生语义误解,如:
vector<int> v(10);

v[5] = 10; // 操作符 [] 的返回值为引用,被赋值为10

// 如果操作符 [] 返回指针,语句如下:
*v[5] = 10; // 容易被误解为向量指针
总结

虽然指针和引用的功能相同,但在使用细节上还是有需要思考的地方,混乱使用可能造成严重的后果。

理清它们的区别与联系后,根据实际需要选用即可。

参考资料

《More Effective C++》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值