C++ 将内存分配给命名空间中定义的变量时

C++ 将内存分配给命名空间中定义的变量时,c++,static,C++,Static,例如,假设a是ClassA中的公共静态成员 namespace SPACE{ char* ClassA::a=NULL; ClassA::ClassA() { ClassA::a="initialized here"; } } 所以有两个问题: 何时调用a=NULL?在main()之前还是之后 既然a是静态成员,为什么可以用NULL和在此处初始化来定义它两次 在main()之前 它只在命名空间范围内定义一次。第二个是赋值。构造函数运行时调用它,它修改已经存

例如,假设
a
ClassA
中的公共静态成员

namespace SPACE{

   char* ClassA::a=NULL;

   ClassA::ClassA()
   {
     ClassA::a="initialized here";
   }
}
所以有两个问题:

  • 何时调用
    a=NULL
    ?在
    main()
    之前还是之后
  • 既然a是静态成员,为什么可以用
    NULL
    在此处初始化
    来定义它两次
  • main()之前

  • 它只在命名空间范围内定义一次。第二个是赋值。构造函数运行时调用它,它修改已经存在的(定义和初始化的)变量

  • main()之前

  • 它只在命名空间范围内定义一次。第二个是赋值。构造函数运行时调用它,它修改已经存在的(定义和初始化的)变量

  • 什么时候调用
    a=NULL
    ?在
    main()之前还是之后

    很有可能,它永远不会被调用:因为这是一个常量初始化值,所以可以由系统上的可执行文件的加载程序在不运行任何代码的情况下对其进行初始化。如果它是用一些代码初始化的,例如
    a=my_init_func();
    ,这些代码将在
    main()
    之前完成

    既然a是一个静态成员,为什么可以用
    NULL
    和“initialized here”两次定义它

    第二个是赋值,不是声明

    什么时候调用
    a=NULL
    ?在
    main()之前还是之后

    很有可能,它永远不会被调用:因为这是一个常量初始化值,所以可以由系统上的可执行文件的加载程序在不运行任何代码的情况下对其进行初始化。如果它是用一些代码初始化的,例如
    a=my_init_func();
    ,这些代码将在
    main()
    之前完成

    既然a是一个静态成员,为什么可以用
    NULL
    和“initialized here”两次定义它


    第二个是赋值,不是声明。

    该代码不正确。
    ClassA::a=NULL;
    命名空间级别不应编译。是否缺少类型?该代码不正确。
    ClassA::a=NULL;
    命名空间级别不应编译。是否缺少类型?