C++编程:指针与引用的抉择
需积分: 11 94 浏览量
更新于2024-11-27
收藏 635KB PDF 举报
"More Effective C++"
在C++编程中,指针和引用都是重要的工具,它们提供了间接访问对象的能力。然而,它们之间存在着显著的差异,这些差异影响了何时以及如何选择使用它们。
首先,指针允许为空值,而引用则必须始终引用一个对象。这意味着,如果一个变量可能在某个时刻不指向任何对象,那么应该将其声明为指针,以便可以赋予它空值(NULL)。例如:
```cpp
char *pc = 0; // 设置指针为空值
```
然而,尝试将空指针赋值给引用会导致未定义的行为,这是极其有害的:
```cpp
char *pc = 0; // 设置指针为空值
char &rc = *pc; // 让引用指向空值,这是非常有害的
```
在C++中,引用必须在声明时初始化,这确保了引用总是指向某个对象:
```cpp
string &rs; // 错误,引用必须被初始化
string s("xyzzy");
string &rs = s; // 正确,rs 指向 s
```
引用的这一特性使得使用引用的代码通常比使用指针更高效,因为不需要像指针那样进行空值检查。例如:
```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"
```
在这个例子中,尽管 `s1` 的值改变了,但 `rs` 仍然引用 `s1`,而不是 `s2`。这表明引用提供了一种固定引用对象的机制,而指针则允许动态改变所指对象。
在考虑使用指针还是引用时,需要权衡灵活性(如指针的可变性和空值可能性)和安全性(如引用的不变性和强制初始化)。对于函数参数,引用常用于传递不可变对象的副本,而不会增加额外的内存开销,同时防止意外修改原始值。指针则适用于传递可变对象,或者在不知道具体类型的情况下使用多态性。
理解并熟练掌握指针和引用的差异是C++编程中的关键技能。在设计和实现程序时,应根据需求的特定情况选择合适的间接访问方式,以实现最佳的性能和安全性。
2009-11-20 上传
2010-05-26 上传
2007-07-04 上传
2008-05-28 上传
2011-05-16 上传
2007-10-12 上传
2024-11-29 上传
pg19870116
- 粉丝: 12
- 资源: 10
最新资源
- Python中快速友好的MessagePack序列化库msgspec
- 大学生社团管理系统设计与实现
- 基于Netbeans和JavaFX的宿舍管理系统开发与实践
- NodeJS打造Discord机器人:kazzcord功能全解析
- 小学教学与管理一体化:校务管理系统v***
- AppDeploy neXtGen:无需代理的Windows AD集成软件自动分发
- 基于SSM和JSP技术的网上商城系统开发
- 探索ANOIRA16的GitHub托管测试网站之路
- 语音性别识别:机器学习模型的精确度提升策略
- 利用MATLAB代码让古董486电脑焕发新生
- Erlang VM上的分布式生命游戏实现与Elixir设计
- 一键下载管理 - Go to Downloads-crx插件
- Java SSM框架开发的客户关系管理系统
- 使用SQL数据库和Django开发应用程序指南
- Spring Security实战指南:详细示例与应用
- Quarkus项目测试展示柜:Cucumber与FitNesse实践