引用

引用


1引用的基本概念

提示
初学者跳过本章,请在20章以后回来学习
(1)20章之前不涉及本章语法
(2)先掌握指针的语法
注:“引用”,原C语言中无此语法,是C++特有的 语法。

引用的基本概念
引用, reference
在本质上就是指针,因此要求同学已经熟练掌握了 指针的概念和用法。
在学习本章语法的时候,只要与指针用法相对照, 就很容易理解了。

引用的基本概念
指针类型
int*
double*
Object*
引用类型
int&
double&
Object&
在类型名后面加上一个&号,就是引用类型

引用的基本概念
指针定义
int a = 123;
int* p = &a;
称作:“p指向了变量a”
引用定义
int a = 123;
int& r = a; // 引用的定义
称作:
“r是目标对象a的引用”
“r引用了目标对象a” 和指针是一个意思

引用的基本概念
指针的使用
int a = 123;
int* p = &a;
*p = 999;

引用类型
int a = 123;
int& r = a; // 引用的定义
r = 999; // 对r的操作,就是对a的操作
引用可以看作是目标对象的一个别名,对引用的操作其 实都是对目标对象的操作。

进一步使用举例
引用可以看作是目标对象的一个别名,对引用的操 作其实都是对目标对象的操作。
例1:
int a = 123;
int& r = a;
r = 999; // 则目标对象a变成了999
printf("%p", &r); // 打印的是目标对象a的地址

进一步使用举例
例2:
struct Object
{
int id;
char name[16];
};
Object a = {1, “shaofa”};
Object& r = a;
int size = sizeof®; // size值是多少??

进一步使用举例
例3:
Object a = {1, “shaofa”};
Object& r = a;
r.id = 2; // 访问目标对象
strcpy(r.name, “xyz”); // 访问目标对象

注意事项(1)
引用必须在定义的时候初始化,也就是一创建就要与目 标对象绑定。
以下代码有语法错误:
int a = 123;
int& r; // 语法错!必须初始化!
r = a;
相比之下,指针的用法则比较宽松
int a = 123;
int* p; // OK, 指针可以不初始化
p = &a;

注意事项(2)
辨析:
int a = 123;
int b = 456;
int& r = a;
r = b; // 注意这一步
问:a, b, r的值各为多少?
结论:引用在定义时就与目标对象绑定,无法解绑

小结
介绍了“引用”的语法 a reference of target
引用:从创建开始,就与目标对象绑定

2引用的更多用法

引用的更多用法
(1)引用作为函数的参数
(2)引用作为函数的返回值

引用作为函数的参数
和指针类似,引用也可以作为函数的参数,功能相同。
void test (int& a)
{
a = 999;
}
int main()
{
int number = 0;
test(number);
return 0;
}
“传引用”和“传地址”本质相同:
相当于对参变量作为了一个初始化 int& a = n;

引用作为函数的参数
“传引用”和“传地址”本质相同:
所以,

参数的传递有两种方式: (1)传值 (效率低) (2)传地址或传引用 (效率高)

注:回顾第10章对二者效率的比较

引用作为函数的返回值
和指针一样,引用也可以作为函数返回值。【不易理解,较晦涩】 比如,
int number = 0; // 全局变量
int& test()
{
int& a = number;
return a; // 返回引用
}
int main()
{
int& r = test();
r = 123; // 修改目标对象的值
return 0;
}

引用作为函数的返回值
(1)演化
int number = 0; // 全局变量
int& test()
{
return number; // 此处作了简化
}
return number: 并不是返回了number的值,而返 回了它的引用。

引用作为函数的返回值
(2)返回值作为左值
int main()
{
test() = 123;
return 0;
}
注:普通函数的返回值都只是右值,只有返回引用 时才能当做左值来用(不过可读性不高)

引用作为函数的返回值
(2)返回值作为左值,再来一个例子
struct Object
{
int id;
char name[16];
};
Object one; // 全局变量 Object& test()
{
return one; // 返回全局变量的引用
}
int main()
{
test().id = 10; // 函数的返回值是引用,可以作为左值使用 return 0;
}

安全问题
和指针一样,引用也有安全性问题。
主要是检查: 引用的目标对象是否有效?
比如,以下引用的目标对象是一个局部变量,那么,在 函数退出后,目标对象失效,所以引用也就不能再用了。
int& test()
{
int target = 123;
return target;
}

小节
引用的两个主要用法:
(1)作为参数
(2)作为返回值(较难理解)

学习资源 《C语言/C++学习指南》语法篇(从入门到精通)》

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃蛋炒饭的蜗牛君

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值