C++编程:指针与引用的抉择
需积分: 11 88 浏览量
更新于2024-07-28
收藏 635KB PDF 举报
"More Effective C++"
在C++编程中,`指针`和`引用`是两种重要的概念,它们提供了间接访问其他对象的方式。然而,它们之间存在显著的差异,选择何时使用哪种取决于具体的设计需求和场景。下面将详细讨论这两个特性。
首先,`指针`可以被设置为`NULL`或`nullptr`,表示它不指向任何对象。这在某些情况下是必要的,比如当变量在某个阶段可能不需要指向特定对象时。你可以通过赋值`NULL`或`nullptr`来解除指针的关联。然而,`引用`是不同的,它一旦被初始化,就必须始终引用一个有效的对象,不能为`NULL`。这意味着,如果在设计中允许变量不指向任何对象,那么应该使用指针,以便可以将它设为空值。
尝试让引用`引用空值`是不安全的,如示例所示:
```cpp
char *pc = 0; // 设置指针为空值
char &rc = *pc; // 让引用指向空值,这是非常有害的
```
这段代码会导致未定义的行为,因为引用必须始终引用一个对象。在C++中,引用必须在声明时初始化,不能留作未初始化状态:
```cpp
string &rs; // 错误:引用必须被初始化
```
另一方面,`引用`的一个优点是它们的隐含安全性。由于引用总是有效,所以在使用引用时不需要像检查指针是否为`NULL`那样进行额外的验证:
```cpp
void printDouble(const double &rd) {
cout << rd; // 不需要测试rd,它肯定指向一个double值
}
```
而使用指针时,则需要进行空指针检查:
```cpp
void printDouble(const double *pd) {
if (pd) { // 检查是否为NULL
cout << *pd;
}
}
```
此外,`指针`可以被重新赋值,指向不同的对象,而`引用`一旦初始化后,就不能改变其引用的对象:
```cpp
string s1("Nancy");
string s2("Clancy");
string &rs = s1; // rs引用s1
string *ps = &s1; // ps指向s1
rs = s2; // rs仍旧引用s1,但s1的值现在是"Clancy"
```
在这里,`rs`的引用并没有改变,而是`s1`的内容被更新为了`s2`的内容。相反,`ps`可以通过`ps = &s2;`来改变指向。
总结来说,选择使用`指针`还是`引用`取决于以下几点:
1. 是否允许变量在某些时刻不指向任何对象(使用指针)。
2. 是否需要在程序运行时改变变量所指向的对象(使用指针)。
3. 是否想要提高代码的安全性和效率,减少空指针异常(使用引用)。
4. 初始化的要求,引用必须在声明时初始化,而指针可以在声明后任何时候初始化。
在编写C++代码时,理解这些区别并明智地选择使用哪种类型,可以提高代码的可靠性和可维护性。
2019-03-08 上传
235 浏览量
2007-06-01 上传
2007-11-13 上传
2008-07-27 上传
chenglongming
- 粉丝: 3
- 资源: 18
最新资源
- 高清艺术文字图标资源,PNG和ICO格式免费下载
- mui框架HTML5应用界面组件使用示例教程
- Vue.js开发利器:chrome-vue-devtools插件解析
- 掌握ElectronBrowserJS:打造跨平台电子应用
- 前端导师教程:构建与部署社交证明页面
- Java多线程与线程安全在断点续传中的实现
- 免Root一键卸载安卓预装应用教程
- 易语言实现高级表格滚动条完美控制技巧
- 超声波测距尺的源码实现
- 数据可视化与交互:构建易用的数据界面
- 实现Discourse外聘回复自动标记的简易插件
- 链表的头插法与尾插法实现及长度计算
- Playwright与Typescript及Mocha集成:自动化UI测试实践指南
- 128x128像素线性工具图标下载集合
- 易语言安装包程序增强版:智能导入与重复库过滤
- 利用AJAX与Spotify API在Google地图中探索世界音乐排行榜