int nUserID; //这样的代码在VC6的DEBUG版本是初始化为0,RELEASE是未定义的数值。 //之后有验证的VS10之后的版本DEBUG版本都是未定义的值。
std::cout << m_nData << std::endl;
//sdl有开会直接报错,关闭后运行也会提示错误。
std::vector<unsigned int> vUint; vUint.resize(5);//内部有初始化代码。 for (const auto i : vUint) { std::cout << i << " "; } std::cout << std::endl; int vData[5] = { 0, 1, 2, 3, 4 }; std::array<int, 5> arrayData = { };//5个变量都会初始化为0 for (const auto i : arrayData) { std::cout << i << " "; } std::cout << std::endl;
Class 构造函数中要理解赋值和初始化列表。
class CStringThread { public: CStringThread() //: m_nData(20) //初始化列表。 { m_nData = 10; //赋值。 }; int m_nData = 30; std::vector<std::string> m_vStrData; }; //这种情况构造函数之前之前会先把m_nData的值设置为30,然后在执行赋值。 class CStringThread { public: CStringThread() : m_nData(20) //初始化列表。 { m_nData = 10; //赋值。 }; int m_nData = 30; std::vector<std::string> m_vStrData; }; //这种情况初始化30的代码将被编译器去掉。而且相对来说通过初始化列表的指令更少。
所以这就是为什么当有成员变量的时候,需要实现类的默认构造函数并完成所有成员变量初始化的原因。
赋值内部初始化会先调用默认构造函数,然后调用拷贝构造函数。在初始化列表中只会调用Copy构造函数。
但是如果成员变量很多,并且有多个构造函数的时候可以使用一个单独的Private Init函数来完成初始化。
类中的成员的初始化顺序只跟类中成员变量放的顺序有关,跟初始化列表顺序无关。
//-------------------------------------------------------------------------------------------------------------
函数内的全部变量是Local Static变量。我们要注意的是不同编译单元中的Non Loacal Static变量的初始化问题。
除了在函数内的全局变量,其它:Global变量,Namespace中,Class中,File中的都是非局部全局变量,都会在Main函数之前初始化。
No Local全局变量的初始化问题主要发生在2个全局变量依赖的时候,并且双方有顺序关系,才会出现问题。
Local Static是发生在函数调用期间,首次遇到此对象的时候发生构造操作。这也是为什么单件需要加锁的原因。