"More Effective C++"
在C++编程中,了解指针和引用是非常关键的知识点,因为它们是语言的基石,能够帮助你编写出更高效、更安全的代码。"More Effective C++"这本书深入探讨了这些主题,旨在提升C++程序员的实践能力。
1. **指针与引用的区别**
- 指针:使用`*`和`->`操作符,可以为空(指向NULL或nullptr),并且可以重新赋值指向另一个对象。
- 引用:使用`.`操作符,必须始终引用一个具体的对象,一旦初始化后不能改变引用的对象。
2. **何时使用指针,何时使用引用**
- 如果需要一个变量可能不引用任何对象,或者需要动态地改变它所指向的对象,应使用指针。例如,当处理可选的对象或者需要释放内存时,指针是合适的选择。
- 如果变量必须总是引用一个对象,且在整个生命周期内不会改变,那么使用引用。这增加了代码的清晰性和安全性,因为引用不能为NULL,避免了空指针异常。
3. **空引用的危害**
尝试创建一个空引用是非法的,如示例代码所示:
```cpp
char* pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值,非常有害
```
这样的代码会导致未定义行为,可能会引发运行时错误。因此,你不必担心引用会指向空值,这使得引用在很多情况下比指针更安全。
4. **引用的初始化**
引用在声明时必须初始化,而指针则可以在任何时候初始化。例如:
```cpp
string& rs; // 错误,引用必须被初始化
string s("xyzzy");
string& rs = s; // 正确,rs引用s
string* ps; // 未初始化的指针,合法但危险
```
5. **效率与安全性**
- 引用在使用时不需要进行空指针检查,提高了效率,因为它们总是有效引用。
- 反之,对于指针,为了确保安全,每次使用前都需要检查是否为NULL,如`printDouble`函数中的例子所示。
6. **不可变性**
引用一旦绑定到一个对象后,就不能再改变绑定的对象。例如:
```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++的强大功能至关重要。通过"More Effective C++"这样的书籍,你可以深入学习这些高级主题,提升你的C++编程技巧。