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是建议性关键字,编译器是否按照建议执行是不一定的,容易造成用户困扰
相关推荐
小师兄吃牛肉30 分钟前
C语言中的nullptr有必要吗
c语言·c++·算法
WL学习笔记1 小时前
日期类(C++)
开发语言·c++·日期类实现
谢亮_vipxieliang2 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛2 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
xxwl5852 小时前
数据结构知识点和代码实现总结(C语言实现)
c语言·开发语言·数据结构
汉克老师3 小时前
GESP2026年9月认证C++八级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
郝学胜_神的一滴5 小时前
C++ Templates 06:搞懂模板代码的三种组织方式
c++·visual studio
C++ 老炮儿的技术栈5 小时前
sizeof操作符
c语言·c++·人工智能·mfc·c
沫璃染墨5 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
wuminyu5 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++