无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果都是相同的。不同之处在于,使用构造函数初始化列表初始化数据成员,没有定义初始化列表的构造函数在构造函数体中对数据成员赋值。
对于const和reference类型成员变量,它们只能够被初始化而不能做赋值操作,因此只能用初始化列表。
还有一种情况就是, 类的构造函数需要调用其基类的构造函数的时候。请看下面的代码:
对于const和reference类型成员变量,它们只能够被初始化而不能做赋值操作,因此只能用初始化列表。
还有一种情况就是, 类的构造函数需要调用其基类的构造函数的时候。请看下面的代码:
#include <iostream>
using namespace std;
class A //A是父类
{
private:
int a; //private成员
public:
A() {}
A(int x):a(x) {} //带参数的构造函数对a初始化
void printA() //打印a的值
{
cout << "a = " << a << endl;
}
};
class B : public A //B是子类
{
private:
int b;
public:
B(int x, int y) : A(x) //需要初始化b以及父类的a
{
//a = x; //a为private,无法在子类被访问,编译错误
//A(x); //调用方式错误,编译错误
b = y;
}
void printB() //打印b的值
{
cout << "b = " << b << endl;
}
};
int main()
{
B b(2,3);
b.printA(); //调用子类的printA()
b.printB(); //调用自己的printB()
return 0;
}
从上面的程序可以看到,如果在子类的构造函数中需要初始化父类的private成员,直接对其赋值是不行的(代码23行),只有调用父类的构造函数才能完成对它的初始化。但在函数体内调用父类的构造函数也是不合法的(代码24行),只有采取21行中的初始化列表调用子类构造函数的方式。程序的执行结果如下:
a = 2
b = 3
当类中含有const、reference成员变量以及基类的构造函数都需要初始化列表。