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;
};
2. 必须使用初始化列表初始化一个常量成员;
class CBase
{
public:
CBase(int a) : m_a(a) //m_a是一个const常量,必须通过初始化列表初始化
{
//m_a = a; //错误,此处相当于赋值操作,但是const是不可修改的,无法作为左值;
}
public:
const int m_a;
};
3. 初始化派生类的基类时,必须使用初始化列表进行初始化;
#include <iostream>
using namespace std;
class Base
{
public:
Base(int a) : val(a) {}
private:
int val;
};
class A : public Base
{
public:
A(int v) : p(v), Base(v) {}
void print_val() { cout << "hello:" << p << endl;}
private:
int p;
};
int main(int argc ,char **argv)
{
int pp = 45;
A b(pp);
b.print_val();
}
4. 当初始化成员对象时,必须使用初始化列表进行初始化;
class CBase
{
public:
CBase(int a) : m_a(a) //m_a是一个const常量,必须通过初始化列表初始化
{
//m_a = a; //错误,此处相当于赋值操作,但是const是不可修改的,无法作为左值;
}
public:
const int m_a;
};
class CSub
{
public:
CSub() : m_obj(88) //正确, 成员对象初始化
{
cout << "this is m_obj::m_a = " << m_obj.m_a << endl;
}
public:
CBase m_obj;
};
参考文章:
1、https://www.cnblogs.com/weiyouqing/p/14598387.html
2、https://www.bbsmax.com/A/Gkz12KpQJR/