何时初始化const变量

时间:2014-03-27 12:21:07

标签: c++ c variables const

何时以及如何在C / C ++中初始化const变量?我对特定类型感到好奇:

1) const static member of a class
2) function const local variable
3) const global variable

我的意思是应用程序运行时而不是源代码初始化它们的方式。

2 个答案:

答案 0 :(得分:4)

  

1)类的静态成员

如果它是使用常量表达式初始化的简单类型,则在静态初始化阶段,在运行任何用户代码之前初始化它。

否则,如果它是具有非平凡构造函数的类类型,或者具有非常量初始化器,则在动态初始化阶段初始化它。这将在调用在同一翻译单元中定义的任何函数之前发生;但是有潜在的死亡陷阱:

  • 在初始化其他静态变量之前可能不会发生;如果他们的构造者访问它,你会得到邪恶的错误。
  • main开始之前可能不会发生,如果它是在不同的单位中定义的。
  • 如果你从不在同一个单位调用任何功能,它可能根本不会发生。
  

2)函数const局部变量

如果它是静态的,那么它会在程序第一次达到其定义时初始化。如果它是自动的,它会在每次程序到达时初始化,并在超出范围时被销毁。

  

3)const全局变量

与第一个相同。两者都有静态存储持续时间,因此根据相同的规则进行初始化和销毁​​。

备注:

因为你问的是两种不同的语言:在C语言中,没有“动态初始化”这样的东西,并且在任何用户代码运行之前都会初始化所有非本地静态变量。

const对变量的初始化时间和方式没有影响。

答案 1 :(得分:2)

存储持续时间告诉您在分配和解除分配程序中的变量时适用的规则。回答你的问题是为你提到的每个案例指定存储时间。

1) const static member of a class  : static storage duration,
                                     simple type - static initialisation,
                                     class with non-trivial constructor - dynamic
                                     initialisation
2) function const local variable   : automatic storage duration ( but static 
                                     duration if it is static const),
                                     automatic variable is initialized each time
                                     the code is run,
                                     static variable is initialized the first
                                     time code is run, 
3) const global variable           : static storage duration
                                     simple type - static initialisation,
                                     class with non-trivial constructor - dynamic
                                     initialisation

Explanation存储持续时间:

  

自动存储时间

     

变量在封闭代码块的开头分配   并在最后解除分配。所有非全局变量都有此存储   持续时间,除了声明为static,extern或thread_local的那些。

     

静态存储时间

     

变量在程序开始时分配,在释放时分配   该计划结束。只存在一个变量实例。全球化   变量具有此存储持续时间,以及使用static声明的那些   或者是extern。

     

线程存储时间

     

变量在线程开始时分配,并在分配时分配   线程结束。每个线程都有自己的变量实例。   只有声明为thread_local的变量才具有此存储持续时间。   thread_local可以与static或extern一起出现以进行调整   连锁。 (自C ++ 11起)

     

动态存储时间

     

使用动态为每个请求分配和释放变量   内存分配函数。