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

需积分: 11 0 下载量 124 浏览量 更新于2024-10-28 收藏 635KB PDF 举报
"《More Effective C++》是一本经典的C++教材,主要探讨了C++编程中的高级主题和最佳实践。书中提到了指针和引用这两个核心概念,并深入比较了它们之间的区别和使用场景。" 在C++编程中,指针和引用是两种常见的间接访问对象的方式,虽然它们在外观和功能上有些相似,但在实际应用中有着本质的不同。条款一重点讨论了何时选择指针,何时选择引用。 首先,引用必须始终引用一个有效的对象,不能设置为NULL或空值。这意味着一旦引用被初始化为某个对象,它就不能改变引用的对象。相反,指针可以被设置为NULL,也可以改变以指向不同的对象。这种特性使得指针在处理可能为空的情况时更为灵活,而引用则在确保对象存在的场景下提供了更安全的访问。 考虑以下代码示例: ```cpp char *pc = 0; // 设置指针为空值 char& rc = *pc; // 让引用指向空值,这是不安全的 ``` 这段代码会导致未定义的行为,因为引用`rc`试图绑定到一个空值,这是禁止的。在C++中,引用必须在声明时进行初始化,并且不能改变引用的目标。 另一方面,引用的这种特性也带来了效率上的优势。由于引用总是有效的,所以在使用引用时无需进行空指针检查,如`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" ``` 在这个例子中,`rs`引用`s1`的值,而`ps`指向`s1`的地址。尽管`rs`的值(即`s1`)可以改变,但`rs`本身仍然引用`s1`,不会改变引用的目标。 《More Effective C++》中的条款一提醒程序员在选择使用指针还是引用时,要考虑安全性、效率和代码的可读性。指针适用于需要空值检查或动态改变目标对象的场合,而引用更适合于需要提供安全、固定引用的场合,如函数参数传递和成员函数的this指针。理解这些基本概念对于编写高效、可靠的C++代码至关重要。