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

需积分: 11 2 下载量 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++编程中的关键技能。在设计和实现程序时,应根据需求的特定情况选择合适的间接访问方式,以实现最佳的性能和安全性。