C++引用的基本概念

引用是变量的别名,必须在声明时初始化且不能更改绑定对象。语法格式为 数据类型 &引用名 = 变量名

  • 引用必须绑定到有效的存储空间(如变量),不能绑定到字面量或临时对象(除非是 const 引用)。
  • 引用本身不占用额外内存空间,其操作直接作用于原变量。

引用与指针的区别

  • 引用必须在声明时初始化,指针可以延迟初始化。
  • 引用绑定后不可更改,指针可以重新指向其他对象。
  • 引用没有空值(nullptr),指针可以为空。
  • 引用语法更简洁,无需解引用操作符(*)。

示例代码:

int a = 10;
int &ref = a;  // 引用初始化
int *p = &a;   // 指针初始化
ref = 20;      // 直接修改a的值
*p = 30;       // 通过指针修改a的值

引用作为函数参数

引用常用于函数参数传递,避免拷贝开销并允许修改实参(替代指针的显式解引用)。

void swap(int &x, int &y) {
    int temp = x;
    x = y;
    y = temp;
}
int main() {
    int a = 1, b = 2;
    swap(a, b);  // 直接修改a和b的值
}

常量引用(const引用)

常量引用可以绑定到临时对象或字面量,常用于函数参数以避免不必要的拷贝和保护数据。

void print(const std::string &s) {
    std::cout << s;  // 避免拷贝且防止修改s
}
int main() {
    print("Hello");  // 合法:const引用绑定到临时字符串
}

引用作为返回值

函数可以返回引用,但需确保返回的对象生命周期足够(如全局变量、静态变量或传入的参数)。

int &getMax(int &x, int &y) {
    return (x > y) ? x : y;
}
int main() {
    int a = 5, b = 10;
    getMax(a, b) = 20;  // 修改较大的变量(b变为20)
}

右值引用(C++11引入)

右值引用(&&)用于绑定临时对象,支持移动语义和完美转发,提升性能。

void process(int &&x) {
    std::cout << "Processing rvalue: " << x;
}
int main() {
    process(42);  // 合法:绑定到右值
}

注意事项

  • 避免返回局部变量的引用(会导致悬垂引用)。
  • 引用不能绑定到位域(bit-field)。
  • 函数重载时,引用类型需与调用匹配(如 func(int&)func(const int&) 是不同的重载)。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐