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

需积分: 11 5 下载量 19 浏览量 更新于2024-12-28 收藏 635KB PDF 举报
"More Effective C++.pdf 是一本经典的C++教程,探讨了如何更有效地使用C++编程语言,包括指针和引用的区别及其应用。" 指针与引用是C++中两种重要的间接访问对象的方式,它们各有特点。指针可以用`*`和`->`操作符,而引用则使用`.`操作符。尽管它们在功能上相似,但有显著的差异。 首先,指针可以是空值(NULL),允许你在某些时刻不指向任何对象。这在需要动态绑定或可选对象时很有用。然而,引用必须始终引用一个具体的对象,这意味着它不能为NULL。如果设计中变量不能允许为空,使用引用是一个好选择。 尝试让引用指向空值是不安全的,如示例所示: ```cpp char *pc = 0; // 设置指针为空值 char& rc = *pc; // 让引用指向空值,非常有害 ``` 这段代码会导致未定义的行为,因为引用必须在创建时就被初始化且始终指向一个有效的对象。 在C++中,引用在声明时必须初始化,例如: ```cpp string& rs; // 错误:引用必须被初始化 string s("xyzzy"); string& rs = s; // 正确:rs引用s ``` 而指针可以声明后不初始化,虽然这样做很危险,但却是合法的: ```cpp string* ps; // 未初始化的指针,合法但危险 ``` 使用引用的代码通常效率更高,因为它不需要像指针那样在使用前进行空值检查。例如: ```cpp void printDouble(const double& rd) { cout << rd; // 不需要检查rd,它肯定指向一个double值 } void printDouble(const double* pd) { if (pd) { // 检查是否为NULL cout << *pd; } } ``` 在上述函数中,使用引用的`printDouble`无需担心空指针异常,而使用指针的版本则需要进行空指针检查。 另一个关键区别在于,指针可以重新赋值以指向不同的对象,而引用一旦初始化后就不能改变其引用的对象。比如: ```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`的值改变了,但`rs`本身并没有改变,而`ps`可以通过重新赋值指向`s2`。 选择使用指针还是引用取决于你的具体需求。如果需要动态绑定、可选对象或存储多个对象的地址,指针是更好的选择。如果希望确保一个变量始终关联一个特定对象,且不允许为NULL,那么引用是理想的选择。理解这两者的差异并适当运用,是提升C++编程效率和代码质量的关键。