任一个对象的创建都要调用构造函数,而在构造函数中一般要给对象属性赋值。成员初始化列表(member initialize list)是构造函数中特有的语法,用以简化对对象属性的赋值。其用法如下:
class MyClass { int m_a, m_b, m_c; public: MyClass(int a = 0, int b = 0, int c = 0) : m_a(a), m_b(b), m_c(c) { } };以上代码相当于:
class MyClass { int m_a, m_b, m_c; public: MyClass(int a = 0, int b = 0, int c = 0) { m_a = a, m_b = b, m_c = c; } };用成员初始化列表的语法来表述很显然代码更简洁,并且其允许形参名和属性名相同而不会造成混淆,如以下代码片段也是正确的语法:
class MyClass { int a, b, c; public: MyClass(int a = 0, int b = 0, int c = 0) : a(a), b(b), c(c) { } };成员初始化列表虽然好用但也要注意一点,就是列表中语句执行的顺序。请看如下代码:
class MyClass { public: int m_b, m_a; MyClass(int a, int b) : m_a(a), m_b(m_a + b) { } }; void tmyclass() { MyClass first(1, 2); cout << first.m_a << " " first.m_b << endl; }初步一看,你可能觉得输出结果为1和3,事实上m_b的值是不确定的,因为 成员初始化列表中对属性赋值的顺序是和类属性声明的顺序一致的,和列表中初始化语句表达式的顺序无关,也就是说,在列表中虽然m_a初始化语句写在前面,但因为属性声明中m_b先于m_a声明,所以m_b先被初始化,而m_a这个时候是不确定的,所以输出结果中m_b的值是不确定的。