在谈C++初始化列表这个内容前,我们先来回顾下const 修饰的变量,我们知道,在C语言中,被const修饰的变量是不可以被直接改变的,在C++中,const升级了,被const修饰后就直接进入常量符号表,是真正意义上的常量。既然我们知道这些知识,那么在C++的类中,我们能不能定义一个const变量?下边我们就直接用代码来验证下我们的设想:
#include <iostream>
#include <string>
using namespace std;
class test
{
private:
const int m_value = 10; //定义一个const成员变量,并初始化为10(编译error)
public:
test()
{
m_value = 20; //在构造函数中为其赋值 (编译error)
}
void setValue(int i)
{
m_value = 30; //在成员函数中为其赋值(编译error)
}
int getValue()
{
return m_value;
}
};
int main()
{
test t;
system("pause");
}
编译结果如下:
从编译结果,看来在类中定义并初始化const变量、或者对const变量直接赋值,是行不通的,那么怎样才能在类中定义时初始化const成员变量?这就需要这节我们说的初始化列表。
C++中提供初始化列表对类成员变量进行初始化,先来看下初始化列表的语法规则(其中的m1为成员变量,v1为要初始的值)
要说明的一点是,初始化列表是优先于构造函数执行,下边我们把m_value在初始化列表中初始化
#include <iostream>
#include <string>
using namespace std;
class test
{
private:
int m_i;
const int m_value; //定义一个const成员变量
public:
test():m_value(10), m_i(20) //在初始化列表中将const变量m_value初始化为10, m_i初始化为20
{
}
int getValue()
{
return m_value;
}
int getI()
{
return m_i;
}
};
int main()
{
test t;
cout << "t.getValue() = " << t.getValue() << endl;
cout << "t.getI() = " << t.getI() << endl;
system("pause");
}
这里我们定义了一个普通的成员变量,一个const成员变量,并且都在初始化列表中对他们进行初始化,来看看编译输出的结果:
输出结果表明,可以定义const成员变量,但是需要在初始化列表中对成员变量进行初始化。
对于初始化列表,有如下几点需要注意:
-可以使用初始化列表对类成员进行初始化
-初始化列表优先于构造函数执行
-成员变量的初始化顺序与定义的顺序相同
-成员变量初始化的顺序与初始化列表的顺序无关
依据上边三点,我们回头看看代码,我们定义的两个成员变量的初始化顺序为 先初始化m_i,再初始化m_value,跟定义的顺序一样,与初始化列表写的顺序无关。
对于类中的const成员
-类中的const成员会被分配内存空间,本质是只读变量
-类中的const成员只能在初始化列表中初始化
-编译器无法得到const成员的初始值,因此无法进入符号表成为真正意义上的常量