non-local-static 变量的初始化

non-local-static 变量,包括global对象、定义于namespace作用域内的对象,classes内、以及在file作用域内被声明为static的对象,不包括在函数内的static变量。由于c++对不同编译单元non-local-static 变量的初始化顺序没有规定,如果这些non-local-static变量之间存在相互依赖,则被依赖的变量可能没有完全初始化。如

//Month.h
class Month
{
public:
    ~Month(void);
    static Month Jan;
    static Month Feb;
    explicit Month(int a);
    int val;
};
//Month.cpp

#include "Month.h"

Month Month::Feb(2);
Month Month::Jan(1);
Month::Month(int a):val(a)
{
}
Month::~Month(void)
{
}
//MonthTest.h
#include "Month.h"
class MonthTest
{
public:
    MonthTest(void);
    ~MonthTest(void);
    Month month;
};

//MonthTest.cpp
#include "MonthTest.h"

MonthTest::MonthTest(void):month(Month::Feb)
{
}

MonthTest::~MonthTest(void)
{
}
MonthTest m_test;
//main
extern MonthTest m_test ;
int _tmain(int argc, _TCHAR* argv[])
{
    cout << m_test.month.val <<endl;
    getchar();
    return 0;
}

输出结果0。

说明Month::Feb并未初始化。因为Month::Feb和m_test都是non-local-static变量,定义在不同的编译单元中,而m_test依赖于Month::Feb,而Month::Feb并未初始化,这样的程序存在风险。

怎么办,把non-local-static 变量变为local-static变量,并返回该变量,需要变量时调用函数即可,如下

static Month Jan()
{
  return Month(1);
}
static Month Fet()
{
   return Month(2);
}

总之,一句话,所有的static变量(包括全局变量)全部放在函数内定义,即都定义为local-static变量。non-local-static变量没有存在的必要。

non-local-static 变量的初始化,布布扣,bubuko.com

时间: 2024-10-08 16:23:33

non-local-static 变量的初始化的相关文章

[转]在static代码块或static变量的初始化过程中使用ServiceManager提供的api的陷阱

一. 案例 1.源码: /** @hide */ private TelephonyManager(int slotId) { mContext = null; mSlotId = slotId; if (sRegistry == null) { if (sRegistry == null) { sRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService( "telephony.registry")

C/C++之全局、static对象/变量的初始化问题

关于全局.static对象/变量的初始化问题 1. 全局变量.static变量的初始化时机:main()函数执行之前(或者说main中第一个用户语句执行之前). 2. 初始化顺序. 1)全局对象.外部static对象 a)同一编译单元(同一源文件)中,按照对象/变量的定义顺序初始化. b)不同编译单元,C++标准未保证初始化先后顺序,只保证都在main()之前初始化完成. 2)函数内部local static变量,在该函数调用过程中第一次遇到该static变量时初始化.      基于以上观点,

final,static静态和非静态,初始化和代码块的区别、父类和子类中都有static变量时的初始化顺序、重写equals()、 instanceof强制转换

final:类不能被继承,方法不能被重写,属性值不能被修改(常量): 可以调用: static静态常量----- 不需要创建对象,可以直接调用类里面的属性,方法: 示例如下: 加了static说明它是属于整个类的,每个对象值都一样,如下图所示:size是静态的,所以当在下面t1对象中改变size的值时,整个类中的size值都变了:然后作为普通属性的length,当在t1对象中改变其值,并不会改变原始值: 静态方法不能调用非静态的方法和非静态的属性,也不能打印非静态的方法和非静态的属性:可以在静态

C++ static变量的钻牛角尖

最近面试的时候被问到了static的一些关于默认值,初始化,作用范围一系列的问题,好多都不会,虽然面上了,回来还是想好好把这些东西复习一下. static变量的默认值(即不进行赋值与调用默认构造函数) 类外声明int float double 的static变量不初始化则默认值为0,可以使用不会报错,指针类型的static变量默认值为NULL 类中声明的static则默认没有初始化,不初始化使用则不能通过编译. static变量的初始化 在类中声明的static 变量不会也不能在类中初始化,但是

调整static变量初始化顺序的一个办法

// wrap the LaunchDir variable in a function to work around static/global initialization order static FString& GetWrappedLaunchDir() { static FString LaunchDir; return LaunchDir; } 在ue4中看到这么一段代码,注释有点意思 不同cpp文件里的全局static变量初始化顺序是不可控的 FString显然会依赖很多内存分配

static, const 和 static const 变量的初始化问题

const 常量的在超出其作用域的时候会被释放,但是 static 静态变量在其作用域之外并没有释放,只是不能访问. static 修饰的是静态变量,静态函数.对于类来说,静态成员和静态函数是属于整个类的,而不是属于对象.可以通过类名来访问,但是其作用域限制于包含它的文件中. static 变量在类内部声明,但是必须在类的外部进行定义和初始化. const 常量在类内部声明,但是定义只能在构造函数的初始化列表进行. class A { public: A(int a) : constNum(a)

c++ 类与函数中static变量初始化问题(转)

首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: 1 void Foo() 2 { 3 static int a=3; // initialize 4 std::cout << a; 5 a++; 6 } 里的static int a=3只执行了一次.在main中调用Foo()两次,结果为34.将上面的函数改为 1 void Foo() 2 { 3 static int a; 4 a=3; // not initialize 5 std::cout <<

static修饰变量的初始化

调用取静态变量的值时,如果要初始化的话,得在静态块或调用该值方法那边初始化 静态块初始化: public class StaticDemo {private static String str; //定义的静态变量 static{ str = "静态块命名"; } public static String getStr() { return str; }} 在main方法调用 public class Test { public static void main(String[] ar

关于C#中的变量的初始化问题浅谈

C#变量初始化是C#强调安全性的另一个例子.简单地说,C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量.大多数现代编译器把没有初始化标记为警告,但C#编译器把它当作错误来看待.这就可以防止我们无意中从其他程序遗留下来的内存中获取垃圾值. C#变量初始化的操作中有两个方法可确保变量在使用前进行了初始化: ◆变量是类或结构中的字段,如果没有显式初始化,创建这些变量时,其值就默认是0(类和结构在后面讨论). ◆方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值.此

static 变量的作用:

概念:静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值.静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见. 1.先来介绍它的第一条也是最重要的一条:隐藏 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性. 2. static的第二个作用是保持变量内容的持久 存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.共有两种变量存储在静态存储区:全局变量和static