上一篇:当前java软件开发中几种认识误区 >>
more effective c++:指针与引用的区别
首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
“但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
| char *pc = 0; // 设置指针为空值 char& rc = *pc; // 让引用指向空值 |
这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。
因为引用肯定会指向一个对象,在C里,引用应被初始化。
| string& rs; // 错误,引用必须被初始化 string s("xyzzy"); string& rs = s; // 正确,rs指向s |
指针没有这样的限制。
| string *ps; // 未初始化的指针 // 合法但危险 |
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
| void printDouble(const double& rd) { cout << rd; // 不需要测试rd,它 } // 肯定指向一个double值 |
相反,指针则应该总是被测试,防止其为空:
| void printDouble(const double *pd) { if (pd) { // 检查是否为NULL cout << *pd; } } |
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
| string s1("Nancy"); string s2("Clancy"); string& rs = s1; // rs 引用 s1 string *ps = &s1; // ps 指向 s1 rs = s2; // rs 仍旧引用s1, // 但是 s1的值现在是 // "Clancy" ps = &s2; // ps 现在指向 s2; // s1 没有改变 |
总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。
| vector v(10); // 建立整形向量(vector),大小为10; // 向量是一个在标准C库中的一个模板 v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值 |
如果操作符[]返回一个指针,那么后一个语句就得这样写:
| *v[5] = 10; |
但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。
当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。
下一篇:asp.net底层架构探索之再谈.net运行时 >>
相关文章:
- · 免费短信诱惑你 中移动推im软件飞信
- · word文档打印预览时也能编辑
- · 实例分析 用clipmate增强剪贴板功能
- · 不再垂帘听政 让administrator发挥作用
- · 360安全卫士发布恶意软件判别标准
- · 如何绕过wga从微软网站任意下载软件
- · 开源运动:正改变着这个世界和互联网
- · 无奈百度再次进入多事之秋
- · 百度居然做假为天空软件站扬名
- · 4万“换客”网上淘金
- · 手绘技能剖析渐进教程:用笔触塑造形体
- · 简单设置 阻止qq里垃圾消息的骚扰
- · colorkey xp应用指南
- · qq空间初级玩家必学的11条技巧
- · 教你另类共享歌曲办法
- · 用qq也能截取屏幕上的动态图像
- · 千千静听 满足你挑剔的耳朵
- · 两大超强备份工具使用详解
- · 小软件把msn表情符号组成文字
- ·
- · qq会员到底有哪些特权
- · qq被盗了可以这样找回来
- · 视频格式转换工具使用集锦
- · 桌面利器 打造完美绝酷桌面
- · 教你把pdf文档看个清楚
- · msn群出新版 可传图片可截屏
- · 新浪爱问专业版开测 探路付费搜索
- · ie7 beta 3 for windows xp sp2 更新
- · maxthon浏览器也玩网络电视
- · 妙用收藏夹当主页
- · greenbrowser技巧大杂烩
- · 两种方法打造绿色版ie7 beta3
- · 玩转firefox的cookie设置
- · dudu加速器应用技巧四则
- · 让web迅雷不再“从头再来”
- · 迅雷全新版本功能放送
- · bt种子查找实用技巧集锦
- · 迅雷断点续传来修复破损光盘
