C++中的指针与引用选择指南

需积分: 11 0 下载量 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++代码时,理解这些区别并根据实际需求做出选择,对于编写高效且安全的代码至关重要。