6月1日 10:35
C++ 指针和引用有什么区别?各自适用什么场景?
指针是一个变量,存储另一个变量的内存地址,本身占用内存;引用是已存在变量的别名,与被引用对象共享同一内存地址。指针声明后可不初始化,也可以置为nullptr;引用必须在声明时绑定到一个对象,且不存在"空引用"。指针可以重新指向其他对象,引用一旦绑定就无法更改绑定目标——对引用赋值实际是修改所引用对象的值。指针支持算术运算(加减偏移、指针减法算距离),引用不支持任何算术操作。作为函数参数时,指针传递显式取地址,调用处能看出可能修改实参;引用传递语法上像值传递,但实际可修改实参,语义更隐蔽。返回值方面,返回指针要考虑空指针风险,返回引用要保证所引对象生命周期超出函数作用域,返回局部变量的引用是未定义行为。
追问
引用在底层是怎么实现的?
编译器通常用指针实现引用,即引用变量底层也是一个地址。但C++标准不要求这样实现,只要语义正确即可。所以sizeof(引用)等于所引类型的大小,而非指针大小。
什么时候用指针,什么时候用引用?
函数参数优先用引用——语义更清晰,不存在空值问题。需要"可能不指向任何对象"或"需要重新指向"时用指针。C++惯用法中,函数参数用const引用避免拷贝,返回值用指针表达"可能失败"。
const引用绑定到临时对象会发生什么?
const引用可绑定到右值,编译器会延长临时对象的生命周期至引用的生命周期结束。这是C++中少有的生命周期延长规则,非常量引用不允许绑定到右值。
引用能实现多态吗?
可以。基类引用引用派生类对象,通过引用调用虚函数同样走vtable动态绑定,和指针多态行为一致。