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

引用

  • 概念:引用不是新定义一个变量,而是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间
  • 特性
    • 引用在定义时必须初始化
    • 一个变量可以有多个引用
    • 引用一旦引用一个实体,再不能引用其它实体(引用具有常性)
cpp 复制代码
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是建议性关键字,编译器是否按照建议执行是不一定的,容易造成用户困扰
相关推荐
jerryinwuhan1 分钟前
机器人模拟器(python)
开发语言·python·机器人
孤廖24 分钟前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
驰羽32 分钟前
[GO]GORM中的Tag映射规则
开发语言·golang
非凡的世界1 小时前
深入理解 PHP 框架里的设计模式
开发语言·设计模式·php
小龙报1 小时前
《算法通关指南---C++编程篇(3)》
开发语言·c++·算法·visualstudio·学习方法·visual studio
凤山老林1 小时前
排序算法:详解插入排序
java·开发语言·后端·算法·排序算法
豆沙沙包?1 小时前
2025年--Lc197-077. 排序链表(链表,尾插法)--Java版
java·数据结构·链表
Mr_WangAndy1 小时前
C++设计模式_行为型模式_状态模式State
c++·设计模式·状态模式
郝学胜-神的一滴2 小时前
Effective STL 第5条:区间成员函数优先于单元素成员函数
开发语言·c++·程序人生·stl·软件工程
杨福瑞2 小时前
C语言数据结构:算法复杂度(2)
c语言·开发语言·数据结构