以前没有注意到这些变量的初始化顺序问题,这虽然是个小问题但是也是一直容易被忽略的问题。

1、在使用构造函数的初始化列表初始化成员变量时,与初始化成员列表的顺序无关,只与定义成员变量的顺序有关。

class Test
{
public:
    Test() : m_b(2), m_a(m_b + 1) {}
    void showinfo() const
    {
        cout << "m_a=" << m_a << " " << "m_b=" << m_b << endl;
    }
    int m_a;
    int m_b;
};
void test01()
{
    Test p1;
    p1.showinfo();
}

运行结果

 先执行m_a=m_b+1,而此时m_b并没有初始化。

2、如果不使用构造函数的初始化列表初始化,而是在构造函数内初始化时,此时初始化顺序与成员变量在构造函数中的位置有关。

class Test
{
public:
    Test()
    {
        m_b = 1;
        m_a = m_b + 2;
    }
    void showinfo() const
    {
        cout << "m_a=" << m_a << " " << "m_b=" << m_b << endl;
    }
    int m_a;
    int m_b;
};
void test01()
{
    Test p1;
    p1.showinfo();
}

运行结果

 3、类中const成员常量必须在构造函数初始化列表中初始化,static成员变量必须在类外初始化。

class Test
{
public:
    Test():m_c(100)
    {
        m_b = 1;
        m_a = m_b + 2;
    
    }
    void showinfo() const
    {
        cout << "m_a=" << m_a << " " << "m_b=" << m_b <<" "
        <<"m_c="<<m_c<<" "<<"m_d="<<m_d<< endl;
    }
    int m_a;
    int m_b;
    const int m_c;
    static int m_d;
};
int Test::m_d = 0;
void test01()
{
    Test p1;
    p1.showinfo();
}

运行结果