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

发布于:2025-06-23 ⋅ 阅读:(15) ⋅ 点赞:(0)

引用

  • 概念:引用不是新定义一个变量,而是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间
  • 特性
    • 引用在定义时必须初始化
    • 一个变量可以有多个引用
    • 引用一旦引用一个实体,再不能引用其它实体(引用具有常性)
  • 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是建议性关键字,编译器是否按照建议执行是不一定的,容易造成用户困扰

网站公告

今日签到

点亮在社区的每一天
去签到