C++在类的构造函数中,可以两种方式初始化成员数据,可以用构造函数进行初始化类的成员数据,也可以定义初始化成员列表(Initializer list)来初始化成员数据(data member),但是有些情况是不可以用构造函数函数对类中的成员数据进行初始化的,比如有类中的成员有const修饰的时候。
下面介绍一下第二种情况,初始化成员列表(Initializer list)来初始化成员数据(data member)。什么情况下用初始化成员列表呢?
(1)需要初始化的数据成员是对象的情况;
(2)需要初始化const修饰的类成员;
(3)需要初始化引用成员数据;
这里会对(2)情况详细解说
c++初始化化列表的语法规则是:
ClassName::ClassName():
m1(v1), m2(v1,v2), m1(v3)
{
}
下面进行一个小实验加以说明:
#include <stdio.h>
class Value
{
private:
int mi;
public:
Value(int i)
{
printf("i = %d\n", i);
mi = i;
}
int getI()
{
return mi;
}
};
class Test
{
private:
const int ci;
Value m2;
Value m3;
Value m1;
public:
Test() : m1(1), m2(2), m3(3), ci(100)
{
printf("Test::Test()\n");
}
int getCI()
{
return ci;
}
int setCI(int v)
{
int* p = const_cast<int*>(&ci);
*p = v;
}
};
int main()
{
Test t;
printf("t.ci = %d\n", t.getCI());
t.setCI(10);
printf("t.ci = %d\n", t.getCI());
return 0;
}
编译执行的结果
重点内容
结论:
**与初始化顺序列表无关, Test() : m1(1), m2(2), m3(3), ci(100)
与成员的声明顺序相同**
注:本文参考来自狄泰学院