c++之引用
时间:2022-07-23
本文章向大家介绍c++之引用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
什么是引用? 引用:给数据起别名
格式:数据类型 数据名 = &数据名;
#include <iostream>
using namespace std;
int main() {
int a = 10;
int &b = a;
cout << "a的值是:" << a<<endl;
cout << "b的值是:" << b << endl;
a = 11;
cout << "a的值是:" << a << endl;
cout << "b的值是:" << b << endl;
b = 12;
cout << "a的值是:" << a << endl;
cout << "b的值是:" << b << endl;
system("pause");
return 0;
}
输出:
b引用a,b和a指向相同的内存地址, 所以当其中一个变化,另一个的值也会进行相应的变化。
注意事项:
- 引用必须初始化; int &b;//错误,没被初始化
- 引用在初始化之后就不能够被改变了; int a = 10; int &b = a; int c = 20; b = c;//这里就是错误的。
引用做函数的参数:
作用:参数传递时,可以通过引用的技术让形参修饰实参。
优点:简化指针修改实参。
#include <iostream>
using namespace std;
//值传递
void swap1(int a, int b) {
int tmp = a;
a = b;
b = tmp;
}
//地址传递
void swap2(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
//引用传递,形参可以修饰实参
//也就是&a,&b是a,b的别名
void swap3(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
int main() {
int a = 10;
int b = 20;
cout << "a的值是:" << a<<endl;
cout << "b的值是:" << b << endl;
swap1(a, b);
cout << "swap1之后a的值是:" << a << endl;
cout << "swap1之后b的值是:" << b << endl;
swap2(&a, &b);
cout << "swap2之后a的值是:" << a << endl;
cout << "swap2之后b的值是:" << b << endl;
swap3(a, b);
cout << "swap3之后a的值是:" << a << endl;
cout << "swap3之后b的值是:" << b << endl;
system("pause");
return 0;
}
输出:
不难发现,地址传递和引用传递均可以通过形参的改变而影响实参的值。
引用做函数的返回值:
#include<iostream>
using namespace std;
//不能返回局部变量的引用
int& func() {
int a = 10;
return a;
}
//函数的调用可以作为左值
int& func2() {
//静态变量,在所有程序结束后才释放
static int a = 10;
return a;
}
int main() {
int& res = func2();
cout << res << endl;
cout << res << endl;
func2() = 100;
//相当于都是变量a的引用
cout << res << endl;
cout << res << endl;
system("pause");
return 0;
}
输出:
一句话来说就是:一荣俱荣,一损俱损。
引用的本质:
本质:引用的本质在C++内部实现实际上是一个指针常量;
#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;//内部发现ref是引用,自动转换成*ref=20;
cout << "a="<<a << endl;
cout <<"ref="<< ref << endl;
func(a);
cout << "a=" << a << endl;
cout << "ref=" << ref << endl;
system("pause");
return 0;
}
输出:
常量引用:
作用:用来修饰形参,防止误操作。
void func(const int &tmp) {
//tmp= 100;不合法了
}
nt a = 10;
const int* ref = a;//不合法,必须是引用一段合法的内存空间
const int* ref2 = 10;//合法
- 图片和视频防盗链简单介绍
- 对比cp和scp命令 将数据从一台linux服务器复制到另一台linux服务器
- laravel—用Migration的操作数据库
- 有货移动Web端性能优化探索实践
- webpack打包速度和性能再次优化
- MySQL 清除表空间碎片
- 解决ios不支持按钮:active伪类的方法
- HTTP-FLV直播初探
- BZOJ1058: [ZJOI2007]报表统计
- React数据流和组件间的通信总结
- react+redux+webpack教程4
- 洛谷P2391 白雪皑皑(并查集)
- BZOJ4514: [Sdoi2016]数字配对(费用流)
- 3.2数据结构之指针和链表 1748:约瑟夫问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android的Dialog弹出时隐藏导航栏效果,目前认为的最优解
- WebService接口调试如此简单
- 嵌入式linux下的c语言简易日志log模块,带颜色显示(一)
- 嵌入式linux下的c语言日志log模块,功能增强(二)
- Spring IOC源码最全分析
- 嵌入式linux之go语言开发(六)几行代码实现终端的远程日志诊断
- spring-mybatis 整合分析
- Spring 中循环依赖是如何解决?
- 走,HashMap,敢去爬山吗?
- Django+Vue开发生鲜电商平台之10.购物车、订单管理和支付功能
- 嵌入式linux之go语言开发(七)protobuf的使用
- 动手写简单的嵌入式操作系统一
- LeetCode 92 | 大公司常考的面试题,翻转链表当中指定部分
- 快速学习-Apollo从入门到精通
- dotnet 使用 SourceLink 将 NuGet 链接源代码到 GitHub 等仓库