C++引用初始化和赋值

C++引用两大核心规则完整理解

一、两条规则原文

  1. 引用定义时必须立刻初始化,不存在“空引用”;
  2. 引用一旦绑定某个变量,终身不能改绑到其他变量

先记住底层本质:引用本质是变量的别名,不是独立变量
指针是独立变量,存地址;引用只是给已有变量多起一个名字,没有自己独立内存。


1. 规则1:引用必须初始化

错误示范

int& r; // 编译报错!

原因:引用是别名,你声明了别名,但没说它是谁的别名,编译器不知道它绑定哪个变量,非法。

正确写法

int a = 10;
int& r = a; // 定义同时绑定a,r就是a的别名

延伸:能绑定什么?

  1. 左值变量(普通变量):最常用
double d = 3.14;
double& rd = d;
  1. const引用可以绑定常量/临时值
const int& cr = 100; // 合法,const引用特殊规则
int& r = 100;        // 报错:普通引用不能绑临时常量

对比指针(反衬引用特性)

指针可以先定义、后赋值,允许空:

int* p;    // 合法,野指针
p = &a;    // 后面再赋值
int* p2 = nullptr; // 空指针合法

引用没有这个自由度,天生不能空。


2. 规则2:绑定后不能重新指向别的变量

代码演示,分清「赋值」和「改绑定」

int a = 10;
int b = 20;
int& r = a; // r是a别名

r = b;      // ❗不是把r改成b的别名!只是赋值操作

关键拆解 r = b;

  • r 永远是 a 的别名;
  • r = b 等价于 a = b
  • 执行后:a 的值变成20,r 依旧绑定 a,没有换目标。

证明无法改绑

int a=10, b=20;
int& r = a;
cout << &r << " " << &a << endl; // 地址完全相同

r = b;
cout << &r << " " << &a << endl; // 地址没变,还是a的地址

地址不变,说明绑定关系终身不变。

再对比指针(指针可以随意改指向)

int a=10, b=20;
int* p = &a;
p = &b; // 完全合法,指针直接改存的地址,指向b

指针是独立变量,存地址,内容可改;
引用是别名,绑定关系写死,只能修改绑定对象的值。


3. 通俗生活化理解

比喻:人 & 外号(引用=外号)

变量 = 真人张三;
引用 = 外号“小张”。

  1. 必须初始化
    不能凭空创造一个外号“小张”,必须先有真人张三,才能给张三起外号;
    不存在没有对应真人的外号(不存在无初始化引用)。

  2. 外号不能换人
    “小张”这个外号一旦给了张三,永远指代张三;
    你写一句“小张=李四”,不是把外号转给李四,只是让张三复制李四的属性,外号还是张三的。

指针比喻:纸条写人名

指针是一张纸条,上面写人的地址:

  • 纸条可以空白、可以后面改写地址、可以换写别人地址;
    和引用(外号)完全两套逻辑。

4. 常见易错场景总结

场景1:误以为赋值会改引用指向

int x=1, y=2;
int& ref = x;
ref = y;
// 错误认知:ref现在绑定y
// 真相:x = y,ref依旧绑定x

场景2:函数引用参数也遵循该规则

void func(int& r) {
    int b = 99;
    r = b; // 只是修改外部实参的值,不能让r绑定b
}

场景3:数组不能有引用数组,但数组元素可以是引用

int a=1,b=2;
int& arr[] = {a,b}; // 报错,引用数组非法(底层绑定不可变更)
int* parr[] = {&a,&b}; // 指针数组合法

场景4:const引用强化不可修改绑定

int m = 5;
const int& cr = m;
cr = 10; // 报错:连绑定对象的值都不能改,绑定更不可能换

5. 一句话精炼总结

  1. 引用是已有变量的别名,创建时必须指定给谁起别名,所以必须初始化;
  2. 别名和原变量终身绑定,赋值只会修改原变量的值,不会更换别名归属,因此不能重新绑定其他变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值