li-heng 2023-02-03 22:22 采纳率: 80.8%
浏览 140
已结题

C++ inline、staitc、const三合一谁能讲通透

本人做c++开发,谁能把 inline、staitc、const修饰函数、修饰成员变量、修饰局部变量讲明白呢
不同修饰符号、编译后、运行时,所在的内存区域,最好能Demo验证!

  • 写回答

7条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-03 22:28
    关注
    inline

    inline 是一个函数修饰符,是用来请求编译器在调用处展开该函数的代码,并不是生成一个函数调用的机器代码。这养,就可以提高程序的执行速度了,但是会增加了程序的代码数量。

    static

    static 是一个修饰符,可以用于修饰函数、成员变量和局部变量。当 static 修饰一个函数时,它的生存期与整个程序相同,当且仅当在定义它的文件内才能看到。当 static 修饰成员变量时,它是该类的类成员,并且与整个类共享一个实例。当 static 修饰局部变量时,它的生存期与整个程序相同,但也是当且仅当在定义它的代码块内才可以看见。

    stcon:
    
    

    const 是一个修饰符,可以用于修饰函数、成员变量、局部变量和指针。当 const 修饰一个函数时,它声明该函数不会修改对象的状态。当 const 修饰成员变量时,它声明该成员变量是一个常量,不能在类的其他成员函数中被修改。当 const 修饰局部变量时,它声明该变量是一个常量,不能被修改。当 const 修饰指针时,它声明该指针指向的对象是一个常量,不能通过该指针修改指向的对象的值。
    const 修饰指针时,在下面的代码中看到编译器生成的错误信息:

    
    #include <iostream>
     
    int main() {
      int x = 5;
      const int *ptr = &x;  // ptr 是一个指向 int 常量的指针
     
      // 下面的语句将导致编译错误
      // *ptr = 10;
     
      std::cout << "x = " << x << std::endl;
      return 0;
    }
     
     
    

    编译器下错误信息:

    error: assignment of read-only location '*ptr'
     
     
    
    

    说明不能通过该指针修改指向的对象的值。
    代码验证 inline 函数:

    #include <iostream>
    
    inline int max(int a, int b) {
      return a > b ? a : b;
    }
    
    int main() {
      int a = 10, b = 20;
      std::cout << "max(" << a << ", " << b << ") = " << max(a, b) << std::endl;
      return 0;
    }
    
    

    看到以下输出:

    max(10, 20) = 20
    
    

    说明函数 max() 正确地返回了两个整数中的最大值。
    以下代码验证 static 变量:

    #include <iostream>
     
    void incrementStatic() {
      static int count = 0;  // static 变量
      ++count;
      std::cout << "count = " << count << std::endl;
    }
     
    int main() {
      for (int i = 0; i < 5; ++i) {
        incrementStatic();
      }
      return 0;
    }
     
     
    
    

    代码输出:

    count = 1
    count = 2
    count = 3
    count = 4
    count = 5
     
     
    
    

    说明 static 变量在函数被调用多次时仍然保留其值,而不是在每次调用时重新初始化。
     赞
    回复

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 2月16日
  • 已采纳回答 2月8日
  • 创建了问题 2月3日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?