C++核心编程学习--引用

发布于:2025-07-23 ⋅ 阅读:(14) ⋅ 点赞:(0)

引用是起了个别名
引用必须初始化。
引用可以作为函数的左值。

int& func1(){
	int a = 18;  // 在栈区,函数执行完就释放
	return a;
}
int& func2(){
	static int a = 18;  
	return a;
}
int main(){
	int& ref = func1();    // 返回的局部变量存储在栈区的值 因函数执行完而销毁 所以会两次打印不同的值
	cout<< "ref = "<< ref <<endl; // 因此不能将局部变量作为函数左值引用
	cout<< "ref = "<< ref <<endl;
	
	int& ref2 = func2();          // static 放在全局区 程序运行完才会释放 因此可以正常引用
	cout<< "ref = "<< ref <<endl;
	cout<< "ref = "<< ref <<endl;
	
	func2() = 1000;                 // func2返回的是 左值 也就是引用 再对引用变量赋值
									// 相当于把a变量返回 再赋值1000,相当于把a变量赋值1000									
	cout<< "ref2 = "<< ref2 <<endl; // 这里之前用ref2引用了func2,所以也会输出1000
	cout<< "ref2 = "<< ref2 <<endl; // 如果上面函数没有定义返回值为引用类型就不行了,返回的相当于右值
}

左值 (lvalue):有明确内存位置的对象(可放在赋值左侧)
右值 (rvalue):临时对象或字面量(不能放在赋值左侧)
如果函数的返回值是引用,这个函数调用可以作为左值。
为什么呢?因为int func() 返回的是一个值,一个临时的temp = a 相当于18 = 1000;
而引用 int& func() 返回的是一个地址的引用 相当于别名 代指的是变量本身。

引用的本质

引用本质是指针常量 指针常量的指向不可修改 指针指向地址存储的值可以修改。
引用之后 与 引用的地址绑定 这与指针常量一样 指向不可修改
常量指针 为常量在指针。指针指向可以修改,指针指向的地址的值不可以修改。

#include <iostream>
using namespace std;

// 发现是引用,转换为int * const ref = &a
void func(int &ref) {
    ref = 100;  //ref是引用,转换为 *ref = 100   相当于解引用
}

int main() {
    int a = 10;

    // 自动转换为 int* const ref = &a;指针常量是指针指向不可更改,也说明引用为什么不可更改
    int& ref = a;
    ref = 20;

    cout << "a:" << a << endl;
    cout << "ref:" << ref << endl;
    return 0;
}

常量引用

在函数形参列表中,修饰形参防止误操作
const &
局部函数中 val是别名 val在局部函数中修改值 对应的a的值被修改
函数执行完之后 val引用生命周期结束。但是a被修改了。
防止误修改,这里函数形参列表中在常量前加const 防止误修改。

#include <iostream>
using namespace std;

// 打印数据函数
void showValue(int& val) {
    a = 1000;   // 误操作在函数内修改了参数值会导致函数外的变量值也改变
    cout << "val = " << val << endl;
}

// 为了防止误操作,将参数改为常量引用
void showValue(const int& val) {
    // val = 1;  //  错误❌,常量引用只读,不能被修改
    cout << "val = " << val << endl;
}

int main() {

    // 常量引用
    int a = 10;
    // int& ref = 10;   // 报错❌,原因是引用必须引一块合法的内存空间
    const int& ref = 10;    // 正确。加上const后编译器将代码修改为 int temp = 10; int& ref = temp;
    // ref = 20;       // 错误❌,常量引用只读,不能被修改

    cout << a << endl;
    cout << ref << endl;

    int b = 100;
    showValue(b);
    cout << "b = " << b << endl;

    // 使用场景修饰形参,防止误触操作
    int c = 10;
    showValue(c);
    cout << "c = " << c << endl;

}


网站公告

今日签到

点亮在社区的每一天
去签到