C++中的初始化参数列表

c++中以下几种情况的变量的初始化不可以写在构造函数里,而是要写在初始化参数列表中

1.const常量

class AA
{
public :
    const int num;
public :
    AA():num(123)//在初始化列表里初始化const常量
    {


    }
};
int main()
{
    AA aa;
    cout<<aa.num<<endl;
    return 0;
}

2.引用

class AA
{
public :
    int &num;
    int b;
public :
    AA():num(b),b(123)//在初始化列表里初始化引用
    {


    }
};
int main()
{
    AA aa;
    cout<<aa.num<<endl;
    return 0;
}

3.包含另一个类的对象且该类的构造函数是自定义的

class AA
{
public :
    AA(int x)
    {

       cout<<"AA";
    }
};
class BB
{
public :
    AA aa;
public:
    BB():aa(123)//在初始化列表里初始化另一个类
    {
        cout<<"BB";
    }
};

  特别的,我们来看一下下面这种情况:

class AA
{
public :
    int a;
    int b;
public :
    AA(int x):b(x),a(b)
    {


    }
};
int main()
{
    AA aa(100);
    cout<<aa.a<<endl;
    cout<<aa.b<<endl;
    return 0;
}

我们会发现a的结果是有问题的,这是为什么呢?

原因就是我们是先定义a的,自然在这姓的时候就先执行a的赋值,即将b的值赋予a,但此时b还没有值,所以结果只会输出b的值,我们可以通过以下两种方式改正

1.调整变量的定义顺序

public :
    int b;
    int a;
public :
    AA(int x):b(x),a(b)
    {


    }

2.调整赋值顺序

public :
    int a;
    int b;

public :
    AA(int x):b(a),a(x)
    {


    }

  

  

原文地址:https://www.cnblogs.com/curo0119/p/8533668.html