`
wx1569466809
  • 浏览: 72027 次
文章分类
社区版块
存档分类
最新评论

常量变量的生命周期及声明方式

 
阅读更多

##原生数据类型 POD的静态变量##

  1. 静态成员初始化与一般数据成员初始化不同。

    静态成员变量在类里面声明的时候无法直接初始化,需要在类体外部进行初始化,格式如下:

    <数据类型> <类名>::<静态数据成员名>=<值>

     class Test {
     public:
         static int arg1;
     private :
         static int arg2;
     };
    
     int Test::arg1 = 1;
     int Test::arg2 = 2;
    

    初始化的时候不区分public或者private

  2. 常量成员变量及静态常量成员变量的初始化

    • 常量成员变量和静态常量成员变量可以在声明的时候进行初始化
    • 常量成员变量可以在构造的时候进行初始化
    • 静态常量成员变量可以在类体外和静态成员变量一样进行初始化

    示例代码如下:

         class Test {
         public:
             Test() : arg6(6) {}
         public :
             const int arg5 = 5;
             const int arg6;
    
         private :
             const static int arg3 = 3;
             const static int arg4;
         };
         const int Test::arg4 = 4;
    

##静态变量的生命周期##

###常量变量有以下几类:###

  1. 全局常量变量

  2. 命名空间内的常量变量

  3. 类的常量变量

  4. 函数体内的常量变量

对于以上 1/2/3类的静态变量,在程序启动时进行初始化,在程序结束时释放

对于函数体内的静态变量,在第一次执行到该static变量的定义时创建,在程序结束时释放;如果程序一直没执行到该static变量的定义,则一直不会创建,也当然不会释放

###测试分析###

  1. 全局常量变量和命名空间内的常量变量

     class A {
     public:
         A() { cout << "A()" << endl; }
         ~A(){ cout << "~A()" << endl; }
     };
    
     A a;
    
     namespace test {
         class B {
         public:
             B() { cout << "B()" << endl; }
             ~B(){ cout << "~B()" << endl; }
         };
         B b;
     }
    
     int main()
     {
         cout << "main begin" << endl;
         cout << "main end" << endl;
         return 0;
     }
    

    输出:

     A()
     B()
     main begin
     main end
     ~B()
     ~A()
    

    如果把A a的定义放到B b的后面,则输出会变为

     B()
     A()
     main begin
     main end
     ~A()
     ~B()
    

    如果静态常量A和B分别定义在不同的头文件,在庞大的工程中,构建的顺序难以确定,此时静态变量的构造函数、析构函数和初始化的顺序在 C++ 中是不确定的,甚至随着构建变化而变化,导致难以发现的 bug. 所以除了禁用类类型的全局变量,我们也不允许用函数返回值来初始化 POD 变量,除非该函数不涉及(比如 getenv() 或 getpid())不涉及任何全局变量。(函数作用域里的静态变量除外,毕竟它的初始化顺序是有明确定义的,而且只会在指令执行到它的声明那里才会发生。

  2. 类中的常量变量 class A { public: A() { cout << "A::A()" << endl; } ~A() { cout << "A::~A()" << endl; } };

     class B
     {
         static A a;
     };
    
     A B::a;
    
     int main(int argc, char* argv[])
     {
         cout << "main begin" << endl;
         system("pause");
         cout << "main end" << endl;
         return 0;
     }
    

    输出:

     A::A()
     main begin
     main end
     A::~A()
    
  3. 函数中的常量变量

     class A
     {
     public:
         A() { cout << "A::A()" << endl; }
         ~A() { cout << "A::~A()" << endl; }
     };
    
     void func()
     {
         cout << "func start" << endl;
         static A a;
         cout << "func end" << endl;
     }
    
     int main(int argc, char* argv[])
     {
         cout << "main begin" << endl;
         func();
         system("pause");
         cout << "main end" << endl;
         return 0;
     }
    

    输出:

     main begin
     func start
     A::A()
     func end
     main end
     A::~A()
    

    如果不调用func(),则不会输出A::A()和A::~A()

转载于:https://my.oschina.net/wygan/blog/1477330

分享到:
评论

相关推荐

    java 常量与变量

    在Java编程语言中,常量和变量是两个基础且重要的概念。它们是程序中存储数据的容器,理解它们的性质和用法对于编写高效的代码至关...在实际编程中,还需根据需求选择合适的数据类型,并注意变量的作用域和生命周期。

    第4章_JAVA之常量与变量.ppt

    在示例 4-1 中,我们可以看到如何使用常量作为类的成员变量,这样可以确保该值在整个类的生命周期中保持不变。 4.2 变量 变量则是存储数据的容器,它的值可以在程序运行过程中改变。声明变量的基本语法如下: ```...

    Java中的常量和变量概念及定义.docx

    - **局部变量**:局部变量是在方法或语句块内部声明的变量,其生命周期仅限于该方法或语句块。在使用之前必须显式地声明并初始化。 - **成员变量**:成员变量是在类的外部声明但在任何方法之外声明的变量。它们自动...

    C#变量和const常量的使用

    变量的生命周期和作用域也是关键概念。局部变量在方法内部声明,当方法执行完毕,变量就会被销毁。而成员变量属于类,它们在整个对象生命周期内都有效。 接下来,我们讨论const常量。常量是不可更改的值,一旦被...

    VC++中常量与变量的经典案例共9页.pdf.zip

    静态变量在函数内部声明,但其生命周期跨越多次函数调用,保持其上一次调用的值。全局变量在整个程序中可见,而局部变量只在其定义的代码块内有效。 接下来,我们关注一下常量和变量在编程实践中的应用。常量常用于...

    2023-03-31 项目笔记-第一阶段-4.变量、常量 4.3 变量的分类

    3. 静态变量:无论局部还是全局,若声明为`static`,则其生命周期将持续整个程序执行期间,但作用域仍遵循局部或全局规则。静态变量在每次函数调用时不会被重置,而是保留上次调用后的值。 4. 自动变量:这是局部...

    数据库管理与应用常量和变量.doc

    局部变量的生命周期,从声明开始,到声明局部变量的批处理或存储过程的结尾。 1. 声明 Transact-SQL 变量 DECLARE 语句通过以下操作初始化Transact-SQL 变量: * 指定名称。名称的第一个字符必须为一个@。 * 指定...

    Swift教程:Swift基础 常量与变量

    7. **常量和变量的作用域(Scope)**:常量和变量的生命周期限制在其所在的代码块、函数或类型内部。在作用域之外,它们将不再可用。 通过学习Swift中的常量和变量,你可以更好地构建稳定且易于维护的代码。了解...

    c语言变量和常量的使用1

    生命周期则是指变量或常量从创建到销毁的时间段。 在C语言中,内存管理也与变量息息相关。变量的内存分为栈内存(自动变量)和堆内存(动态分配的内存)。栈内存由编译器自动管理,而堆内存则需要程序员手动申请和...

    2-类型、变量与常量.ppt

    在C#编程语言中,类型、变量和常量是构建程序的基础元素,它们的重要性不言而喻。...在实际编程中,还需要注意类型之间的转换、错误处理以及变量的生命周期等细节,这些都是编写高质量C#程序的关键要素。

    C语言从入门到精通视频教程下载第2章 不变的和变的箱子——常量与变量.zip

    在第二章中,你将学习如何声明和使用常量及变量,如何初始化它们,以及如何在表达式中操作它们。还将涉及变量的存储类别,包括自动变量、静态变量、外部变量和寄存器变量,它们的内存分配和生命周期各有不同。此外,...

    变量、常量、类 三方面C#基础的学习资源

    变量的生命周期和作用域也是学习的重点,例如,局部变量仅在其定义的代码块内有效,而类成员变量在整个类实例的生命周期内都存在。 **常量**: 常量是不可修改的变量,一旦赋值后就不能再改变。在C#中,我们使用`...

    2023-03-31 项目笔记-第一阶段-4.变量、常量 4.1 定义变量的方法

    3. **const关键字**:使用`const`关键字定义常量变量,例如: ```c const int PI = 3.14159; ``` 这种常量在编译时被检查,且不能在运行时修改。 学习C语言时,除了理解变量和常量的定义,还需要注意变量的作用...

    常量、变量和内存.rar

    这部分内容可能会涉及不同类型的数据结构(如数组、链表)、内存模型(如栈和堆)、内存分配策略(如静态和动态分配)以及变量的作用域和生命周期。 通过学习这些基本概念,开发者能够更好地理解和控制程序的行为,...

    VC++中常量与静态变量及其存储位置的定义共2页.pdf

    静态变量(Static Variable),则是一种生命周期不同于普通变量的变量。在函数内部声明的静态变量,其生存期从声明开始,直到程序结束。这意味着即使函数调用结束,静态变量的值也会被保留,下次再次调用该函数时,...

    Unity3D设计基础-常量与变量.pptx

    变量的作用范围决定了变量在代码中的可见性和生命周期。在Unity3D中,变量的作用范围通常由它们被声明的位置决定: - **局部变量**:在函数或方法内部定义的变量,只在该函数或方法的范围内有效。 - **成员变量...

    3.Golang的基础语法(变量,常量)1

    1. 局部变量:在函数内部声明的变量,它们的生命周期局限于该函数,一旦函数执行完毕,变量就会消失。 2. 全局变量:在函数外部声明的变量,其作用域覆盖整个包,甚至可以被其他包引用(如果导出)。全局变量在整个...

    Java中对象的生命周期 ..doc

    ### Java中对象的生命周期 #### 一、对象的生命周期概览 在Java中,对象的生命周期是指从对象被创建到最终被垃圾回收器回收这段时间。理解对象的生命周期对于有效地管理和优化Java应用程序至关重要。 #### 二、...

    VB变量声明

    变量的作用域决定了变量的可见性和生命周期。VB中的变量作用域主要包括以下几种: - **局部作用域 (Local)**:在过程内部声明的变量,只在该过程内部可见。 - **模块/窗体作用域 (Module/Form)**:在模块或窗体级别...

    JavaScript声明全局变量访问方法

    - **内存消耗**:全局变量在整个程序生命周期内都存在,会占用内存资源,因此不建议过多使用全局变量。 - **变量提升(Hoisting)**:`var`声明的变量会被提升到当前作用域的顶部,这可能导致预期外的行为,而`let...

Global site tag (gtag.js) - Google Analytics