C++中的引用

Conclusion结论

引用是变量本身。

Type & rName == Type * const pName.

Usage用法

int var = 10;
int & ref_var = var;
// int & ref_var1 = 10; // cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’
const int & ref_var3 = 10;

引用变量,即ref_var是var的别名,操作ref_var即是操作原变量var。

int swap(int &x, int &y);

形参可以是变量,可以是引用(变量本身)。

// 运行报错
int &getRef() {
    int a = 1;
    return a;  // 不能返回栈上的变量,不能当lvalue。
}

// 正常
int & getRef1() {
    static int a = 1;
    return a;
}
int r1 = getRef(); // r1是a的值
int &r2 = getRef();// r2是a的引用,a本身。
std::cout << r1 << std::endl;  // expect 1
std::cout << r2 << std::endl;  // expect 1
getRef() = 15;
std::cout << r1 << std::endl;  // expect 1
std::cout << r2 << std::endl;  // expect 15
int getInteger(int *&intPtr) {  // 
    intPtr = (int *) malloc(sizeof(int));
    *intPtr = 233;
}

int *intPtr = NULL;
getInteger(intPtr);
std::cout << *intPtr << std::endl;  // expect 233
free(intPtr);
int var = 29;
const int &ref_var = var; // 不能使用ref_var修改var,引用被const修饰,只读

// ref_var1 = 12; // Cannot assign to variable `ref_var` with const-qualified type  'const int &'
std::cout << ref_var1 << std::endl;  // expect 29
var1++;
std::cout << ref_var1 << std::endl;  // expect 30

const int &ref == const int * const ptr.

int getInteger(const int *&intPtr) {
    intPtr = (int *) malloc(sizeof(int));
    // *intPtr = 233;  // Read-only variable is not assignable
}