在C++中,初始化成员列表(Initializer List)是一种特殊的构造函数语法,用于在对象创建时直接初始化其成员。初始化成员列表通常用于以下几种情况:
1、初始化基类构造函数
一个类从其他类派生而来,它的构造函数要调用基类的构造函数,所以要初始化基类的成员列表。
代码示例:
#include <iostream>
using namespace std;
class Base{
    public:
        Base(int x):data(x){
            cout<<"Base constructor called with "<<data<<endl;
        }
    private:
        int data;    
};
class Derived:public Base{
    public:
        Derived(int x,int y):Base(x),data(y){
            cout<<"Derived constructor called with "<<data<<endl;
        }
    private:
        int data;
};
int main()
{
    Derived(10,20);
    return 0;
} 
运行结果:

2、初始化常量成员
常量成员必须在构造函数中初始化,因为该成员变量一旦初始化,就不能再改变。
#include <iostream>
using namespace std;
class Myclass{
    private:
        int const Data;//常量成员
    public:
        Myclass(int value):Data(value){
            cout<<"Myclass constructor called with "<<Data<<endl;
        }
        
};
int main()
{
    Myclass obj(10);
    return 0;
} 
运行结果:

3、初始化引用成员
引用成员定义后必须初始化,引用成员变量初始化必须绑定一个对象,并且绑定后的对象不能修改,所以必须初始化引用成员。
#include <iostream>
using namespace std;
class Myclass{
    private:
        int &refData;//引用成员
    public:
        Myclass(int &ref):refData(ref){
            cout<<"Myclass constructor called with reference "<<refData<<endl;
        }
};
int main()
{
    int data = 10;
    Myclass obj(data);
    return 0;
} 
运行结果:

4、初始化需要特殊初始化的成员
某些情况下,成员变量需要特殊的初始化逻辑,而不是简单的赋值。例如,当成员变量是一个复杂的对象时,可能需要执行一些额外的初始化步骤。
代码示例:
#include <iostream>
using namespace std;
class ComplexObject{
    public:
        ComplexObject(const string& name){
            cout<<"ComplexObject constructor called with "<<name<<endl;
        }
};
class Myclass{
    private:
        ComplexObject complexObj;//需要特殊初始化的成员
    public:
        Myclass(const string &name):complexObj(name){
            cout<<"Myclass constructor called"<<endl;
        }
};
int main()
{
    Myclass obj("hello");
    return 0;
} 
运行结果:Myclass中的成员函数的类型涉及到其他类,所以必须要对涉及到的类进行一些额外的初始化步骤。

5、初始化指针成员
当成员是一个指针时,通常需要在初始化成员列表中将其初始化为 nullptr 或者指向一个有效的对象。这个在之前RALL资源获取也讲过,主要方便程序员对内存的分配和释放,防止出现野指针的情况。
6、初始化多个成员变量
当类中有多个成员变量时,可以在初始化成员列表中一次初始化多个成员。
#include <iostream>
using namespace std;
class MyClass {
public:
    MyClass(int a, int b, int c) : data1(a), data2(b), data3(c) {
        cout << "MyClass constructor called" << endl;
    }
private:
    int data1;
    int data2;
    int data3;
};
int main() {
    MyClass obj(10, 20, 30);
    return 0;
}
 
总结:
需要初始化列表成员的情况主要分为:
1、派生类成员需要调用基类的构造函数
2、类成员变量是常量。
3、列表成员存在引用变量。
4、列表成员中存在指针变量
5、列表成员中存在需要特殊初始化的成员
6、存在多个成员变量



















