C++编程:指针与引用的抉择

4星 · 超过85%的资源 需积分: 11 8 下载量 151 浏览量 更新于2024-12-01 1 收藏 635KB PDF 举报
"More Effective C++.pdf - 探讨C++中的指针与引用差异及其使用策略" 在C++编程中,指针和引用是两种重要的间接访问对象的方式,它们各有特点,适用于不同的场景。《More Effective C++.pdf》这本书深入探讨了这两种机制,并提供了实用的建议来帮助开发者做出明智的选择。 首先,指针与引用在语法上有所区别。指针使用`*`和`->`运算符来解引用和访问成员,而引用则通过简单的标识符(就像直接访问对象一样)来实现。然而,它们都能使我们间接地操作其他对象。 在决定何时使用指针、何时使用引用时,一个关键点是,引用必须始终引用某个对象,不能为NULL。这意味着如果变量可能在某些时刻不指向任何对象,那么应该使用指针,因为指针可以被赋值为空值。例如: ```cpp char *pc = 0; // 设置指针为空值 char &rc = *pc; // 让引用指向空值,这是有害的 ``` 上面的代码会导致不确定的结果,甚至可能导致运行时错误。因此,我们应该避免让引用指向空值的情况。在C++中,引用在声明时必须初始化,例如: ```cpp string &rs; // 错误,引用必须被初始化 string s("xyzzy"); string &rs = s; // 正确,rs引用s ``` 相比之下,指针可以在声明时不初始化,但在使用前应检查是否为NULL: ```cpp string *ps; // 未初始化的指针 // 合法但危险 ``` 引用的不可变性意味着它们提供了更高的效率,因为不必检查它们是否为空。例如,在函数`printDouble`中,使用引用作为参数时,无需检查其是否有效: ```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" ``` 《More Effective C++.pdf》这本书强调了理解和正确使用指针与引用的重要性,以提高代码的安全性和效率。开发者应根据具体需求和设计选择使用指针或引用,并遵循最佳实践,以编写更有效的C++代码。