C++中的指针与引用选择指南
需积分: 11 109 浏览量
更新于2024-07-23
收藏 635KB PDF 举报
"More Effective C++"
在C++编程中,`指针`和`引用`是两种重要的概念,它们提供了间接访问其他对象的方式。然而,它们之间存在显著的差异,选择何时使用哪种取决于具体的设计需求和场景。
首先,指针可以为空(NULL),而引用必须始终引用一个对象。这意味着在定义引用时,必须立即对其进行初始化,通常是对某个已存在的对象的引用。例如,尝试定义一个未初始化的引用会引发编译错误:
```cpp
string& rs; // 错误:引用必须被初始化
```
而在定义指针时,可以不进行初始化,但这通常被认为是危险的,因为它可能导致悬空指针:
```cpp
string* ps; // 未初始化的指针,合法但危险
```
尝试将引用绑定到空指针是不被允许的,这样做会导致未定义的行为:
```cpp
char* pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值,非常有害
```
引用的这一特性使得使用引用的代码往往具有更高的效率,因为不需要像检查指针是否为空那样进行额外的安全检查。比如,以下两个函数分别使用引用和指针打印双精度浮点数:
```cpp
void printDouble(const double& rd) {
cout << rd; // 不需要测试rd,它肯定指向一个double值
}
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`,但是`s1`的值被`s2`覆盖了。而`ps`可以通过重新赋值指向`s2`:
```cpp
ps = &s2; // 现在ps指向s2
```
总结来说,选择使用指针还是引用主要考虑以下几个方面:
1. 是否需要空值:如果可能需要一个变量不引用任何对象,那么应该使用指针。
2. 效率:引用不需要安全性检查,效率更高。
3. 变动性:如果需要改变变量所引用的对象,使用指针;如果希望变量始终引用同一对象,则使用引用。
4. 初始化:引用必须在定义时初始化,而指针可以在任何时候初始化。
在编写C++代码时,理解这些区别并根据实际需求做出选择,对于编写高效且安全的代码至关重要。
2019-03-08 上传
235 浏览量
2013-01-11 上传
2008-08-31 上传
2024-11-29 上传
2024-11-29 上传
2024-11-29 上传
myzhanghao1234
- 粉丝: 0
- 资源: 12
最新资源
- 小白的礼物——Verilog实例代码_verilog_verilog实例_verilog实例_
- Python库 | robotslacker-sqlcli-0.1.75.tar.gz
- power_svc_1tcr3tsc.rar_matlab例程_matlab_
- GMusic-Compose-Samples
- Scratch少儿编程项目音效音乐素材-【事件】声音-成功.zip
- One-Piece-Link-Game:Java用于单片链接游戏
- example_sys5:ProducerConsumer 问题使用(System V 信号量共享内存)和进程
- 黑色金属行业报告:黑色金属投研.rar
- zhishool.rar_WEB开发_ASP_
- ffmpeg.nim:ffmpeg nim包装器
- Primality:用Haskell编写的分布式素数查找器。 因为Haskell很酷。 分布式稍后再来
- Python库 | robotslacker-sqlcli-0.0.39.tar.gz
- Scratch少儿编程项目音效音乐素材-【水】相关音效-关开放水.zip
- Ciphers:Vigenere Vernam Ceasar Ciphers解决方案以Java完成的大型项目列表。 GUI元素在Swing中完成。 Vigenere,Vernam和Caesar这三种众所周知的密码的实现
- Python库 | robotremoteserver-1.0.1.tar.gz
- homebrew-proj:用于管理 Web 应用程序项目的 Homebrew 扩展