指针与引用的选择:More Effective C++中的思考

需积分: 11 3 下载量 178 浏览量 更新于2024-07-23 收藏 635KB PDF 举报
"More Effective C++.pdf 是一本关于提高C++编程效率的书籍,其中讨论了指针和引用之间的区别及其使用场景。" 在C++编程中,指针和引用都是间接访问对象的重要工具,但它们有着本质的区别。指针是一个独立的变量,可以存储内存地址,允许通过操作符`*`进行解引用,以及`->`进行成员访问。而引用则更像是一个别名,一旦初始化后,它就固定地引用一个特定的对象,不能改变引用的目标。 条款一开始探讨了何时选择指针,何时选择引用。一个关键的区别在于,指针可以为空(即`nullptr`或`NULL`),而引用必须始终引用一个有效的对象。如果一个变量可能在某些时刻不指向任何对象,那么应当使用指针,因为它可以被赋予空值。反之,如果变量设计上永远不会为空,就应该使用引用,因为它保证始终关联一个对象。 尝试让引用指向空值是不允许的,如示例所示,`char* pc = 0; char& rc = *pc;`会导致未定义的行为,因为引用必须在声明时就被初始化,并且永远指向一个对象。而指针如`string* ps`则可以不初始化,虽然这样做是危险的,但在语法上是允许的。 引用的另一个优点是它们在使用时不需要像指针那样进行空值检查。例如,在函数`printDouble(const double& rd)`中,可以直接使用`rd`,而无需担心它是否为空,因为引用总是有效的。而使用指针的`printDouble(const double* pd)`函数则需要先检查`pd`是否为`NULL`,以防止空指针异常。 此外,指针可以被重新赋值,指向不同的对象,如`string* ps = &s1; ps = &s2;`,这使得指针具有一定的灵活性。然而,引用一旦初始化指向一个对象,如`string s1("Nancy"); string s2("Clancy"); string& rs = s1;`,就不能改变引用目标。即使后续语句`rs = s2;`执行后,`rs`仍然是`s1`的引用,只是`s1`的值被更新为`s2`的值。 总结来说,选择指针还是引用取决于设计需求:如果需要空值支持或动态改变所指对象,使用指针;如果要确保对象的存在并且不希望改变引用目标,那么引用是更好的选择。理解这两者的特性对于编写高效、安全的C++代码至关重要。在实际编程中,明智地使用这两种工具能够提升代码的可读性、稳定性和性能。