C++编程:指针与引用的抉择
需积分: 11 19 浏览量
更新于2024-12-28
收藏 635KB PDF 举报
"More Effective C++.pdf 是一本经典的C++教程,探讨了如何更有效地使用C++编程语言,包括指针和引用的区别及其应用。"
指针与引用是C++中两种重要的间接访问对象的方式,它们各有特点。指针可以用`*`和`->`操作符,而引用则使用`.`操作符。尽管它们在功能上相似,但有显著的差异。
首先,指针可以是空值(NULL),允许你在某些时刻不指向任何对象。这在需要动态绑定或可选对象时很有用。然而,引用必须始终引用一个具体的对象,这意味着它不能为NULL。如果设计中变量不能允许为空,使用引用是一个好选择。
尝试让引用指向空值是不安全的,如示例所示:
```cpp
char *pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值,非常有害
```
这段代码会导致未定义的行为,因为引用必须在创建时就被初始化且始终指向一个有效的对象。
在C++中,引用在声明时必须初始化,例如:
```cpp
string& rs; // 错误:引用必须被初始化
string s("xyzzy");
string& rs = s; // 正确:rs引用s
```
而指针可以声明后不初始化,虽然这样做很危险,但却是合法的:
```cpp
string* ps; // 未初始化的指针,合法但危险
```
使用引用的代码通常效率更高,因为它不需要像指针那样在使用前进行空值检查。例如:
```cpp
void printDouble(const double& rd) {
cout << rd; // 不需要检查rd,它肯定指向一个double值
}
void printDouble(const double* pd) {
if (pd) { // 检查是否为NULL
cout << *pd;
}
}
```
在上述函数中,使用引用的`printDouble`无需担心空指针异常,而使用指针的版本则需要进行空指针检查。
另一个关键区别在于,指针可以重新赋值以指向不同的对象,而引用一旦初始化后就不能改变其引用的对象。比如:
```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`的值改变了,但`rs`本身并没有改变,而`ps`可以通过重新赋值指向`s2`。
选择使用指针还是引用取决于你的具体需求。如果需要动态绑定、可选对象或存储多个对象的地址,指针是更好的选择。如果希望确保一个变量始终关联一个特定对象,且不允许为NULL,那么引用是理想的选择。理解这两者的差异并适当运用,是提升C++编程效率和代码质量的关键。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2009-11-20 上传
2010-05-26 上传
2007-07-04 上传
2008-05-28 上传
白云龙卷风
- 粉丝: 1
- 资源: 25
最新资源
- sweet_smoke_lp
- SPWM.rar_单片机开发_Windows_Unix_
- GMSMapView-Additions:自定义GMSMapView“我的位置”按钮
- Django_Network:Django社交网络
- ImageLab-Initial:ImageLab是一个独立工具,可让用户使用其GUI玩OpenCV
- Teste-oo1:用StackBlitz创建:high_voltage:
- Web应用程序和服务的集中式和分布式日志记录,扩展了System.Diagnostics和Essential.Diagnostics,提供了结构化的跟踪和日志记录,无需更改应用程序代码的1行-JavaScript开发
- torch_sparse-0.6.9-cp36-cp36m-macosx_10_9_x86_64whl.zip
- yukimryh.zip_matlab例程_matlab_
- TeTsuYa IRC Bot-开源
- qa_guru_4_10_owner_xt4k:草稿
- Assembla Mentions-crx插件
- 点击:简单的React useState钩子示例
- 参考资料-中国的书法艺术和技巧.蓝铁.zip
- 一个无主题的Web组件,用于根据表单字段值过滤可见的子元素。-JavaScript开发
- arduino-volume2:Arduino tone()-仅使用扬声器即可实现多种波形和8位音量控制!