在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、存在多个成员变量