指针与引用的差异及高效选择

需积分: 11 1 下载量 184 浏览量 更新于2024-07-30 收藏 635KB PDF 举报
"《更有效的C++》指南深入探讨了指针与引用这两个在C++编程中至关重要的概念。虽然它们在外表和语法上有所不同,如指针使用星号(*)和减号(-),而引用使用的是&操作符,但实际上它们都提供了间接访问其他对象的能力。然而,选择使用哪种类型取决于具体场景。 首先,指针允许空值,可以通过`*pc = 0`设置为空,而引用一旦初始化就必须始终指向某个对象,因此当不确定变量是否始终指向对象时,应使用指针。例如,如果设计中可能有变量变为空的情况,声明为指针更为合适。另一方面,如果设计不允许变量为空,如字符串引用,应确保初始化,如`string s("xyzzy"); string& rs = s;`。 值得注意的是,试图通过引用赋空值,如`char& rc = *pc;`,是极其危险的,可能导致未定义行为,甚至可能导致程序崩溃。为了避免这类问题,C++语言规定引用不能指向空值,因此在使用引用时,无需检查其有效性,提高了代码效率。比如,在打印函数中,直接使用`void printDouble(const double& rd) { cout << rd; }`就足够,无需像`void printDouble(const double* pd) { if (pd) { cout << *pd; }}`那样进行额外的检查。 另外,指针的一个关键特性是可以动态改变所指向的对象,如`string s1("Nancy"); string s2("Clancy"); string* ps = &s1; ps = &s2;`,而引用一旦初始化后就不能更改指向,如`string& rs = s1; rs = s2;`,这使得引用在需要保持稳定引用的对象位置时更加方便。 总结来说,指针与引用在C++中各有优劣,理解它们之间的区别和适用场景是提升代码质量和效率的关键。通过合理的选择和使用,可以写出更有效、更安全的C++代码。"