const、static、内部链接属性和外部链接属性整理

痛定思痛。 2022-01-16 03:20 398阅读 0赞

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

说起const、static、以及#define大家都知道,我一直以为我也是知道的,昨天一同学说他面试时被问到#define定义一个常量和const定义一个常量有什么不同,

我整理了下思路,发现当想向他说清楚这个问题时,我发现自己对const和#define中有些问题还是很模糊,我想这可能就是某位高手说的:“当你可以向别人清楚的

解释某个问题时,你才算真正懂了这个问题”。于是乎,赶紧学习了下,理理思路,记下。

1、c语言中:

  1. 1 const int i=10;
  2. 2 int array[i] ;

  这个i不能说是常量而是一个不可改变的变量,它的不可改变是由编译器确定的,因此将 i 作为数组的长度;会出错,数组的长度

  必须是一个编译期常量(下面解释)。在C++中这样定义却是可以通过的,在C++中有一个常量折叠概念。

2、编译期常量和运行期常量

  两者都是常量,它们的区别, 可以用是否具备内存空间来区分
 编译期常量,
  比如, #define MAX 128
  这个 MAX 就是编译期常量, 没有对应的内存空间,
  在编译时候, 所有的 MAX 都被 128 这个值代替

 运行期常量,
  比如 const int x=128;
  就是一个运行期常量, 分配内存空间,
  但是其值不允许改变

  还有 const int y = ram();//ram()是一个获取随机数的函数,

  这样y肯定是一个运行期常量,在编译时不知道它的值,而是在运行期获得,但不可改变。

3、常量折叠

  所谓“常量折叠”是C++中编译器的一种优化手段,对于上面的const int x = 128;编译器一般不为x分配内存空间,而是将它保存在一个符号表中

  这样导致的结果就是 const int x=128; 类似这样的定义, 产生的结构和 define 一样, 出现 x 的地方直接被 128 这个值代替了

  我了解的,在下面情况下const定义的常量会分配内存。

    1)当用extern修饰const变量将强制为其分配内存,因为extern表示采用外部链接,因此其必须有某个地址保存其值。

    2)等取x的地址时,会强制分配内存。

    3)用static 修饰时,应该也要分配内存。

4、一个类中各种变量的初始化。

  

复制代码

  1. //myclass.h
  2. class myclass
  3. {
  4. public:
  5. myclass();
  6. ~myclass();
  7. public:
  8. int x=1;//error
  9. static int y = 2; //error
  10. const int a = 3;//error
  11. static const int b = 4;//ok
  12. }

复制代码

对于上面这个类中各变量:

  普通变量x如果在类定义的头文件中初始化,由于此时没有定义对象,未分配内存空间,所以没有地方存放x,或者像网友所说:要构造函数干嘛?

  静态变量x不是属于哪一个对象的,所有对象共享,只能初始化一次,若在类中定义,那不每个对象都初始化一次?它初始化一般为:myclass::x = 2;

  const常量在定义时就必须初始化,一般放在初始化列表中初始化。

  static const定义(注:必须是整形或字符型,规定)可以在类定义时直接初始化,首先static被所有对象共享,存储在静态存储区中,其次,const限定了其不可改变,每个对象中都一样。

5、内部链接属性和外部链接属性

  就是相当于c中变量或函数的作用域,static修饰的变量或函数只能在本文件中可见,const修饰的也默认为内部链接属性,extern修饰为外部链接属性(和const同时修饰时,压过const修饰的属性)。

  可能很多说的不是很全面,欢迎指正

转载于:https://my.oschina.net/u/920274/blog/3032754

发表评论

表情:
评论列表 (有 0 条评论,398人围观)

还没有评论,来说两句吧...

相关阅读

    相关 外部<a>

    创建外部链接 HTML 通过使用 `<a>` 标签在 HTML 中创建链接。 注意:移除 target=“\_blank” 属性避免点击链接会打开新的元素页。 注

    相关

    > 我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data bl

    相关 动态静态

    什么是库 库从本质上来说是一种可执行的二进制文件,可以被加载到内存中运行,而根据链接时期的不同,库又可以分为静态库和动态库。 链接 链接就是将不同部分的代码和数据

    相关 动态静态

    什么是库 库从本质上来说是一种可执行的二进制文件,可以被加载到内存中运行,而根据链接时期的不同,库又可以分为静态库和动态库。 链接 链接就是将不同部分的代码和数据