C++编程:指针与引用的深度解析

需积分: 11 1 下载量 98 浏览量 更新于2024-07-26 1 收藏 635KB PDF 举报
"《More Effective C++》PDF版,深入探讨C++编程中的高级主题,包括指针和引用的使用策略。" C++是面向对象的编程语言,它提供了多种方式来处理对象,其中指针和引用是两种非常重要的概念。它们在功能上相似,都允许我们间接访问和操作其他对象,但在实际使用中,它们有各自的特点和适用场景。 首先,指针是一个变量,它存储的是对象的内存地址。通过操作符`*`和`->`,我们可以解引用指针以访问或修改对象。指针可以是空值(NULL),表示它不指向任何对象。这种灵活性使得指针在很多场景下非常有用,比如动态内存管理、数据结构(如链表)以及函数参数传递等。然而,这也带来了潜在的风险,例如空指针解引用会导致程序崩溃。 相比之下,引用更像是一个别名,一旦在声明时被初始化为某个对象,就不能改变引用的对象。引用必须在声明时就赋予一个有效的对象,不能为NULL,这增强了代码的安全性。引用的这种特性使得它们在函数调用中作为参数传递时非常有效,因为它们不会像指针那样产生副本,而是直接操作原对象。此外,引用也常用于模板和STL容器,以简化代码并提高效率。 条款中提到,试图让引用指向空值是非法的,例如: ```cpp char *pc = 0; // 设置指针为空值 char& rc = *pc; // 让引用指向空值,这是非常有害的 ``` 这段代码会导致未定义的行为,应当避免。而引用必须在声明时初始化,如下所示: ```cpp string s("xyzzy"); string& rs = s; // 正确,rs引用s ``` 指针可以重新赋值以指向不同的对象,但引用不行。一旦引用被创建,它就固定指向初始化时的那个对象: ```cpp string s1("Nancy"); string s2("Clancy"); string& rs = s1; // rs引用s1 string* ps = &s1; // ps指向s1 rs = s2; // rs仍旧引用s1,但s1的值现在是"Clancy" ``` 在效率方面,引用优于指针,因为引用总是有效的,所以在使用引用时不需要进行空值检查,如函数`printDouble(const double& rd)`所示。而指针在使用前需要检查是否为NULL,如`printDouble(const double* pd)`所示。 选择使用指针还是引用取决于具体需求。如果需要空值能力或者需要动态改变所指向的对象,选择指针;如果希望确保始终有一个有效的对象并且保持代码简洁安全,那么引用是更好的选择。在C++编程中,理解这两者的区别并灵活运用,是提升代码质量的关键。