C++ - 必须使用初始化列表初始化的四种情况

1. 必须使用初始化列表初始化一个引用成员;

class CBase
{
public:
    CBase(int a) : m_a(a)  //正确,m_a是一个变量的引用,必须通过初始化列表初始化
    {
        // m_a = a;           //错误
        cout << "m_a:" << m_a << endl;
    }

public:
    int& m_a;
};

int main()
{
    CBase base(10);

    return 0;
}

 

2. 必须使用初始化列表初始化一个常量成员;

class CBase
{
public:
    CBase(int a) : m_a(a)  //m_a是一个const常量,必须通过初始化列表初始化
    {
        //m_a = a;          //错误,此处相当于赋值操作,但是const是不可修改的,无法作为左值;
        cout << "m_a:" << m_a << endl;
    }

public:
    const int m_a;
};


int main()
{
    CBase base(20);

    return 0;
}

 

3. 初始化派生类的基类时,必须使用初始化列表进行初始化;(并且基类中只有有参构造函数,没有无参构造函数)

#include <iostream>
using namespace std;


class Test 
{
public:
    //Test() 
    //{ 
    //    cout << "Test 无参构造" << endl;
    //};
    Test(int x) 
    {
        m_x = x; 
        cout << "Test 有参构造" << endl;
    };

    void show() 
    {
        cout << m_x << endl;
    }

private:
    int m_x;
};

class Mytest :public Test
{
public:
    Mytest(): Test(10)
    {
        // 构造函数只能在初始化列表中被显示调用(如果不显示初始化,默认调用默认构造函数),不能在构造函数内部被显示调用
        // 内部调用的是临时变量
        //Test(110);      
        cout << "Mytest 无参构造" << endl;
    };
};


int main()
{

    Mytest mytest;

    return 0;
}

 

4. 数据成员是对象,并且这个对象只有有参构造函数,没有无参构造函数;

#include <iostream>
using namespace std;


class CBase
{
public:
    CBase(int a, int b) :m_a(a), m_b(b)
    {
        cout << "CBase 有参构造" << "m_a=" << m_a << "\t m_b=" << m_b << endl;
    }

private:
    int m_a;
    int m_b;
};


class CSub
{
public:
    CSub() :base(10,20)
    {
        cout << "CSub 无参构造" << endl;
    }

private:
    CBase base;//声明 
};


int main()
{
    CSub sub;

    return 0;
}

 

posted @ 2024-04-18 11:15  [BORUTO]  阅读(29)  评论(0编辑  收藏  举报