引用是别名、不可空、不可重绑,指针是地址变量、可空、可重指向;函数参数优先用const引用避免拷贝,返回值需注意生命周期,成员变量少用引用,操作符重载常返回引用。

引用是别名,指针是地址变量;引用必须初始化且不能改绑,指针可为空、可重指向。
本质与行为差异
引用在语法上是原变量的另一个名字,编译器通常不为其分配独立存储空间(但非绝对,取决于优化);指针是一个保存内存地址的变量,有自己独立的内存空间(如 8 字节)。
引用一旦绑定到某个对象,就无法再指向其他对象;指针可以多次赋值,改变所指地址。
引用不能为空(不存在“空引用”),而指针可以为 nullptr,适合表达“可能无目标”的语义。
函数参数传递:优先用 const 引用
避免拷贝大对象(如 std::string、自定义类)时,用 const T& 最安全高效:
• 不修改实参,又不触发拷贝构造
• 调用方语法简洁(无需取地址)
• 编译器更容易内联优化
指针参数(const T*)虽也能避免拷贝,但调用时需显式传地址,且要检查是否为空——多数场景没必要增加这层负担。
函数返回值:谨慎返回引用或指针
返回局部变量的引用或指针是未定义行为,绝对禁止。
若需返回对象本身(非拷贝),且该对象生命周期长于调用点,可用引用(如容器的 operator[]);
若需要表达“可能找不到/无效”的语义(如查找失败),返回指针更自然(可返回 nullptr);
现代 C++ 更倾向用 std::optional
立即学习“C++免费学习笔记(深入)”;
成员变量和重载操作符中引用更常见
类中一般不用引用类型作为非静态成员(因引用成员要求构造函数初始化列表强制绑定,且不可重新赋值,灵活性差);但指针成员很常见(如 pimpl 惯用法)。
操作符重载中,operator=、operator[]、operator* 等通常返回引用,以支持链式调用(如 a = b = c)或解引用后直接修改;
而像 operator-> 必须返回指针(语言规定)。











