静态变量的初始化

时间:2014-03-23 10:00:10

标签: c++ c static

有人可以告诉我static变量/函数分配内存和内存段吗?即static global variable, static member variable, static local variable等所有都在程序开始之前初始化一次并且都保留其值?

此外,如果Class MyClass具有静态变量count,当我在main中声明MyClass obj时,会创建MyClass对象并为count赋予内存,如果我声明了{ {1}},记忆方面会发生什么? MyClass obj2中是否有count引用了obj2的{​​{1}}?或者只有单独的内存分配。希望这样我能够清楚地提出这个问题。

提前致谢。

3 个答案:

答案 0 :(得分:4)

当我们将类的成员声明为static时,这意味着无论创建了多少个类的对象,都只有static成员的一个副本。 即使没有静态数据成员类的对象存在也存在。

static成员由该类的所有对象共享。

  

如果我宣布MyClass obj2,内存方面会发生什么? count中是否有obj2引用了count的{​​{1}}?

是。所有对象只有一个obj1。这个测试程序会解释清楚这一点;

count

输出:

class Something
{
    public:
    static int s_nValue;
};

int Something::s_nValue = 1;

int main()
{
    Something cFirst;
    cFirst.s_nValue = 2;

    Something cSecond;
    std::cout << cSecond.s_nValue;

    return 0;
}   

由于2 s_nValue成员变量,因此static在类的所有对象之间共享。 因此,s_nValuecFirst.s_nValue 相同。

  

此外,如果类cSecond.s_nValue具有MyClass变量计数,当我在main中声明tatic时,则会创建MyClass obj对象并为MyClass提供内存

没有。实际上,即使没有实例化类的对象,count也存在!

答案 1 :(得分:0)

关键字static可能会被视为有些过度&#34;重载&#34;。

以下用法选项都是可行的:

  • 静态局部变量
  • 静态全局变量
  • 静态成员变量
  • 静态全局函数
  • 静态成员函数

变量:

就运行时而言,所有类型的静态变量基本相同。它们都位于程序的数据部分中,并且它们的地址在程序执行期间保持不变。因此,它们之间的唯一区别是在编译期间,在声明范围内:

  • 静态局部变量:仅在函数范围内由编译器识别
  • 静态全局变量:仅在文件范围内由编译器识别
  • 静态成员变量:仅在类
  • 的范围内由编译器识别

功能:

就运行时而言,所有类型的函数(静态和非静态)基本相同。它们都驻留在程序的代码段中,并且它们的地址在程序执行期间保持不变。因此,它们之间的唯一区别是在编译期间,在声明范围内:

  • 静态全局函数:仅在文件范围内由编译器识别
  • 静态成员函数:仅在类
  • 范围内由编译器识别

答案 2 :(得分:0)

关键字static具有不同的含义,具体取决于它所使用的上下文。static变量在堆上分配,它们的生命周期在整个程序运行中延伸。

  1. 静态全局变量与全局变量相同,只是static关键字将变量的范围限制为仅包含它的文件。这称为文件链接或内部链接。

  2. 定义包含它的类时,会创建静态成员变量。这意味着可以使用类的名称访问它。该变量在类的所有实例中共享。

  3. 静态局部变量与静态全局变量具有相同的生命周期,但其范围是包含它的直接块。

  4. 当使用static关键字限定函数时,这意味着函数的范围是仅包含它的文件。该函数不能被另一个文件中的函数调用。这又称为文件范围或内部链接。

相关问题