初始化列表有什么用?
在不知道初始化列表的时候我可以在构造函数体内进行初始化,就是对成员变量赋值。为什么还需要初始化列表?
这是因为,有些类型的数据无法通过在构造函数体内进行赋值来进行初始化。这样的数据类型有下面3种:
- 引用成员变量
- const成员变量
- 自定义类型成员 (且它的类没有默认构造函数[即,它必须要进行传参])
上面的三种数据类型有一个共同的特点,它们都要求你在定义变量的时候进行赋值。
比如,引用成员变量,使用引用的时候必须进行初始化,否则语法就是错误的。
初始化列表有几个特性:
1、初始化列表先于构造函数执行
2、初始化列表只能用于构造函数
3、初始化列表可以同时初始化多个数据成员
class Box
{
public:
Box();
Box(int h, int w, int len) :height(h), width(w), length(len) //初始化列表
{}
//完全等价于下面这样写
/*
Box(int h, int w, int len)
{
height = h;
width = w;
length = len;
}
*/
int volume();
private:
int height;
int width;
int length;
}
初始化列表的必要性
//例1.初始化列表的必要性
#include<iostream>
using namespace std;
class Circle
{
public:
//Circle() { m_dPi = 3.14 }//错误,编译器提示是const类型,不能再复赋值
Circle() :m_dPi(3.14){}//若初试化的话正确,再次注意,这里是用括号,不是等号
void display()
{
cout << m_dPi << endl;
}
private:
const double m_dPi;
};
int main() {
Circle circle;
//像下面这样是错误的,不能直接访问
//cout << circle.m_dPi << endl;
//可以通过类内函数输出私有变量
circle.display();
return 0;
}