非常量引用的初始值必须是左值_C++知识点 7:引用

7.1 基本用法
#include
using namespace std;// 1、基本语法 --> 类型 &别名 = 原名 ( &使用的位置,类似指针)
void test01()
{
int a = 10;
int &b = a; // 作用: a 和 b 是一样的、同步的( 给a起了个别名叫b)
b = 100;
cout << "a = " << b << endl; // a = 100
}

// 2、注意事项:
void test02()
{
int a = 10;
// int &b; // err:引用必须要初始化
int &b = a; // OK!
int &c = a; // OK! 一个变量可以对应多个别名
//int d = 20;
//int &b = d; // err: 但一个别名只能对用一个变量
// 引用的本质是指针常量: int* const b = &a; b的指向不可以改变,已经指向了a,便不可以指向d
int e = 20;
a = e; // OK! 变量和别名都可以被赋值,有一个变化,其他的同步变化
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
// 3、有关数组的引用: 类型 (&数组别名)[i] = 数组原名 (注意: [i]不可省略,且必须和原数组一致)

void test03()
{
int arr[10];
int(&ARR)[10] = arr; // 给arr数组起引用ARR
for (int i = 0;i < 10;i++)
{
arr[i] = i + 1;
}
for (int i = 0;i < 10;i++)
{
cout << ARR[i] << endl;
}
}
int main()
{
//test01();
//test02();
test03();
return 0;
}

7.2 使用注意事项
1、 引用必须初始化 int &a // err
2、 一个变量可以多次引用,即一个变量可以有多个别名
但是,一个别名只能对应一个变量
3、 对变量或者别名都可以赋值或计算,且效果相同
4、 引用的必须是合法的内存空间
int &a = NULL // err: 初始化不能置空
int &a = 10 // err: 10 在常量区,受保护,引用不合法
5、 不要返回局部变量的引用(注意:加 static 修饰后,可以返回,详见 6 )
原因:函数调用结束后,局部变量内存被系统回收,返回后也无法在正常使用
原理类似于不要返回局部变量的地址

int& func()
{
int a = 10;
return a;
}
int main()
{
int& ret = func();
cout << "a = " << ret << endl; // a = 10,系统给的优化(其实 a 的内存已经被系统回收了)
cout << "a = " << ret << endl; // a = 乱码
}6、 如果函数返回值是引用,那么这个函数的调用可以作为左值
int& func()
{
static int a = 10; // 静态局部变量:生命周期被延长,整个程序运行期间,都存在 a 和&a
return a;
}
int main()
{
int &ret = func(); // ret <==> a
ret = 1000;
func() = 2000; // ret = 2000
cout << "ret =" << ret << endl;
}

f08f1f4f54c89d1f1180aab99d34b8e1.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值