1. 程式人生 > >類的成員變數 宣告順序 決定 初始化順序(建構函式初始化列表不影響)

類的成員變數 宣告順序 決定 初始化順序(建構函式初始化列表不影響)

類成員的宣告順序決定初始化順序;
建構函式初始化列表不影響初始化順序;

C++初始化類成員時,是按照宣告的順序初始化的,而不是按照出現在初始化列表中的順序。

class B
{
public:
    //m_b = 2,m_a = 1
    B():m_a(1),m_b(m_a+1)
    {
        cout << "m_b = " << m_b << ",m_a = " << m_a << endl;
    }
    //m_b = 2,m_a = 1
    B():m_b(m_a+1),m_a(1)
    {
        cout
<< "m_b = " << m_b << ",m_a = " << m_a << endl; } //上述兩個結果一樣的,可以判斷初始化順序由宣告順序決定。 //m_b = 1,m_a = -1218015231 B():m_b(1),m_a(m_b+1) { cout << "m_b = " << m_b << ",m_a = " << m_a << endl; } private: //宣告順序 int
m_a; int m_b; }; int main() { B b; }

例子:

#include <iostream>
using namespace std;

class A
{
public:
    A():a(1),b(8){cout<< "A()"<<endl;}
    int a;
    int b;
};

class B
{
public:
    B():m_b(a.b),m_a(a.a) //建構函式初始化列表
    {
    cout << "m_b = " << m_b << ",m_a = "
<< m_a << endl; } private: //下列為:宣告順序 int m_a; //A a; int m_b; A a; }; class C: public B {}; int main() { B b; C c; return 1; }

不同情況,兩種結果:
當使用//A a;時,下面結果:m_a為隨機值

A()
m_b = 8,m_a = 0
A()
m_b = 8,m_a = -1076785724

當使用A a;時,下面結果:m_a、m_b為隨機值

A()
m_b = -1218158592,m_a = 134514971
A()
m_b = -1219712267,m_a = -1076671652