当前位置: 首页 > news >正文

【C++】入门基础2

 引用

概念


引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间

类型& 引用变量名(对象名) = 引用实体;
注意:引用类型必须和引用实体是同种类型的


引用特性

  • 1. 引用在定义时必须初始化
  • 2. 一个变量可以有多个引用
  • 3. 引用一旦引用一个实体,再不能引用其他实体

使用场景1——引用作参数

void Swap(int& left, int& right)
{int tmp = left;left = right;right = tmp;
}

相比之前的写法简洁了不少,省去了解引用的操作,看上去也更加直观了

使用场景2——引用作返回值

int& Count()
{
static int n = 0;
n++;
// ...
return n;
}


注意:只有 返回的数据为函数调用后不被销毁的数据的时候,引用作返回值才是正确有效的,否则引用会指向被回收的空间,也就是存在越界的风险

这段代码大家看看结果是多少,看看是否真的了解了引用int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) is :"<< ret <<endl;
return 0;
}

引用的底层实现其实还是指针,相比 传值作为返回值,返回引用的效率肯定是更高的

引用的权限放大,缩小和平移

就像日常生活中只能管理下属,不能整治领导一样 

内联函数

在c语言中,如果代码短且重复使用,我们往往采用宏定义的方法来定义函数,可以提高运行效率

但是宏定义有两大缺点无法避免

  • 1.编译阶段进行替换的时候,如果没有加上适当的括号很容易出错
  • 2.无法进行调试

针对以上情况c++提出了内联函数

 

  • 1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
  • 2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性
  • 3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

由上面可得写成内联函数后就会展开,减少栈帧的调用

所以当函数代码少被频繁调用的时候,我们就可以写成内联函数

总结

至此,c++的入门基础知识就了解的差不多了,当然这还不算入门,这些基础知识只是为了后续让我们更好地学习类和对象

只有当类和对象学得七七八八了,c++这门语言我们才算正式入门了,大家一起努力吧!

最后也希望大家多多点赞支持,我也会继续更新的!!!

http://www.lryc.cn/news/98623.html

相关文章:

  • Reinforcement Learning with Code 【Chapter 8. Value Funtion Approximation】
  • 常用InnoDB参数介绍
  • 云原生网关部署新范式丨 Higress 发布 1.1 版本,支持脱离 K8s 部署
  • 【通讯录】--C语言
  • 通过两种实现方式理解CANoe TC8 demo是如何判断接收的以太网报文里的字段的
  • Mysql- 存储引擎
  • vite / nuxt3 项目使用define配置/自定义,可以使用process.env.xxx获取的环境变量
  • 在Linux、Ubuntu中跨平台编译ARM(AARCH64)平台的binutils
  • SpringCloudAlibaba微服务实战系列(五)Sentinel1.8.5+Nacos持久化
  • pytest中conftest的用法以及钩子基本使用
  • 数据结构---顺序栈、链栈
  • 我的MacBook Pro:维护心得与实用技巧
  • Higress非K8S安装
  • QT--day4(定时器事件、鼠标事件、键盘事件、绘制事件、实现画板、QT实现TCP服务器)
  • hjm家族信托科技研究报告
  • [SQL挖掘机] - 视图相关操作
  • 【Quartus FPGA】EMIF DDR3 读写带宽测试
  • Flutter:flutter_local_notifications——消息推送的学习
  • Spring AOP (面向切面编程)原理与代理模式—实例演示
  • 什么是SCRUM认证体系 ?
  • DoIP学习笔记系列:(二)VN5620 DoIP测试配置实践笔记
  • Grafana - TDEngine搭建数据监测报警系统
  • ES6基础知识二:ES6中数组新增了哪些扩展?
  • 使用CRM分析数据有哪些功能?
  • 大数据课程综合实验案例---课设问题汇总
  • 基于Vue+Element Plus实现表格组件
  • MYSQL 主从复制
  • 网络安全领域关键信息泄露事件引发关注
  • AI 绘画Stable Diffusion 研究(一)sd整合包v4.2 版本安装说明
  • 夯实数字化转型安全地基,华东某农商行开源安全治理经验