类的成员变量一般在构造函数调用之前就被创建,当我们的类中有常量,或者引用变量时,我们无法在构造函数中对常量进行赋值。
class Queue{
private:
int* front;
int* rear;
const int size;
int & foo;
public:
Queue(int, int&);
~Queue();
};
Queue::Queue(int s, int& a) {
front = rear = nullptr;
size = s; //操作出错,size是常量
foo = a; //操作出错,foo是引用变量
}
上述代码是错误的。对于常量size,我们无法通过这种方式进行赋值。
成员初始化列表
对于const变量,必须在构造函数之前对于进行初始化。c++提供成员初始化列表来完成这种操作。初始化列表通过:接在构造函数之后,形式为 构造函数:m_name(val)。多个变量以逗号隔开。对于上述类我们使用成员初始化列表编写新的构造函数:
class Queue{
private:
int* front;
int* rear;
const int size;
int& foo;
public:
Queue(int, int&);
~Queue();
};
Queue::Queue(int s, int& a) : size(s), foo(a){
front = rear = nullptr;
}
当然,成员初始化列表不止可以初始化常量,也可以初始化其他的成员变量:
Queue::Queue(int s,int& a) : size(s), foo(a),front(nullptr){
rear = nullptr;
}
调用基类的构造函数和包含对象的构造函数
初始化列表除了能初始化常量和引用之外,更常用的以下三种情况:
1、派生类中调用基类的构造函数
2、类中有对象成员时,调用对象的构造函数
3、委托构造函数——在构造函数中调用另一个构造函数