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;
}