确定对象在使用前已经被初始化

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是发生在函数调用期间,首次遇到此对象的时候发生构造操作。这也是为什么单件需要加锁的原因。

 

 

 

 

 
 

 

 
 

转载于:https://www.cnblogs.com/Operator/p/6089424.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值