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

C++主要知识点详解(引用,内联函数)

引用

  • 概念:引用不是新定义一个变量,而是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间
  • 特性
    • 引用在定义时必须初始化
    • 一个变量可以有多个引用
    • 引用一旦引用一个实体,再不能引用其它实体(引用具有常性)
  • int num = 10;
    int& ref = num;  // ref是num的引用(别名)ref = 20;        // 等价于num = 20;
    cout << num;     // 输出20
  • const引用:用const修饰的引用,该引用变量不能修改,但变量可以修改

  • 应用场景

    • 实现简单,普通的取别名,比如:结构体套结构体,想要使用里层结构体的成员,不方便可直接用引用简化

    • 做函数参数

      • 想要通过形参修改外部实参

        • 指针:指针虽然可以做到,但比较麻烦而且可能会出现指针非法操作异常

        • 引用类型参数:如果不想通过形参改变实参时可以加const进行限制

      • 自定义类型对象传参最好用引用可以提高传参效率

    • 做返回值:注意不能返回栈上空间的引用                                                                                                                                 

  • 引用和指针的区别

    • 概念上:引用就是一个别名,与实体共用一块内存地址空间

    • 底层实现上:引用就是按照指针的方式实现的,即引用的底层就是一个指针,T& == T*const

    • 区别主要体现再特性和使用形式上

      • 引用在定义时必须初始化,而指针没有要求

      • 引用在初始化时引用一个实体后就不能再引用其它实体,而指针可以在任何时候指向任意一个实体

      • 没有空引用,但有空指针

      • 在sizeof中含义不同:引用结果为引用类型大小,但指针始终是地址空间所占字节个数

      • 引用变量的++,是直接给引用实体的值+1,而指针的++是让指针偏移一个类型大小

      • 有多级指针但没有多级引用

      • 访问实体的方式不同,指针需要显示解引用,引用编译器自己处理

      • 引用比指针使用起来相对更安全

内联函数

  • 概念:inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序的运行效率
  • 特性
    • inline是一种空间换时间的做法,省去调用函数的开销,所以代码很长或者有循环/递归的函数不适合使用作为内联函数
    • inline对于编译器来说只是一个建议,编译器会自动优化,如果定义的函数体内有循环/递归等,编译器优化时就会忽略内联
    • inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址了,链接就会找不到
  • 内联函数和宏函数的区别
    • 宏函数
      • 优点:在编译处理阶段会展开,少了函数调用时的开销
      • 缺陷
        • 在预处理阶段展开,增加了预处理时间
        • 编译之前已经展开,如果编译报错,不好定位
        • 参数没有类型,而编译时已经展开,不能进行参数类型检测,安全性低
        • 可读性较差
        • 不能调试
        • 因为已经展开,如果调用位置比较多,会引起代码膨胀
    • 内联函数
      • 优点
        • 是一个函数,参数具有类型,可以进行类型检测,安全性高
        • 在编译阶段展开,少了函数调用开销,提高代码运行效率
        • 是函数,在调用时可以不让编译器展开,方便调试
        • 没有副作用
      • 缺点
        • 可能引起代码膨胀
        • inline是建议性关键字,编译器是否按照建议执行是不一定的,容易造成用户困扰
http://www.lqws.cn/news/476065.html

相关文章:

  • webpack+vite前端构建工具 - 8 代码分割
  • 生成器函数概念与用法详解
  • 【Clickhouse系列】增删改查:对比mysql
  • Clickhouse官方文档学习笔记
  • FastAPI 入门教程 #06:FastAPI 请求体和数据模型
  • 从零理解鱼眼相机的标定与矫正(含 OpenCV 代码与原理讲解)
  • PostgreSQL全栈部署指南:从零构建企业级高可用数据库集群
  • React Next快速搭建前后端全栈项目并部署至Vercel
  • 《DeepSeek原生应用与智能体开发实践》案例重现
  • 关于数学函数和数据类型扩展的详细讲解(从属GESP二级)
  • 30天pytorch从入门到熟练(day1)
  • Mybatis-Plus支持多种数据库
  • 【机器学习四大核心任务类型详解】分类、回归、聚类、降维智能决策指南
  • 多项目预算如何集中管控与动态调整
  • 将Linux装进口袋: Ubuntu to Go 制作
  • 【Linux】进程间多种通信方式对比
  • Typescript基础
  • 【后端】负载均衡
  • MiniMax-M1 开源,Kimi 深度研究内测,GPT-5 今夏发布,Gemini 2.5 稳定上线!| AI Weekly 6.16-22
  • 大模型MetaGPT面试题汇总及参考答案
  • Python-break、continue与else语句
  • OJ搭建:Judge0服务器、DeepSeek服务接入简介
  • 70、爬楼梯
  • 相机camera开发之差异对比核查四:测试机和对比机的Camera动态参数差异对比及关键字
  • 笨方法学python-习题1
  • 设计模式精讲 Day 10:外观模式(Facade Pattern)
  • 无锡哲讯科技:助力纺织业搭乘 SAP 数字化快车
  • [xiaozhi-esp32] 应用层(9种state) | 音频编解码层 | 双循环架构
  • OpenGL ES 中的材质
  • 《高等数学》(同济大学·第7版)第五章 定积分 第二节微积分基本公式