本篇主要介绍C++ 中的初始化列表。

class 类名 {
	类名(行参1,行参2):成员变量1(行参1),成员变量2(行参2) {
		//成员变量1 = 行参1;
		//成员变量2 = 行参2;
		//...
	}
};
  • 成员变量的初始化顺序和初始化列表中的顺序无关,而是取决于成员变量的声明顺序。

来看一个例子,找出下面代码的不妥之处:


class Dumy {
private:
	int m_len;
	string m_str;
public:
	Dumy(string str):m_str(str),m_len(m_str.length()){}
};

根据上面代码,实际上先给 m_len 进行赋值,然后给 m_str 赋值,但在给 m_len 赋值时 m_str 为空,所以造成 m_len 值错误。

修改:

//>1
class Dumy {
private:
	string m_str;
	int m_len;
public:
	Dumy(string str):m_str(str),m_len(m_str.length()){}
};
//>2
class Dumy {
private:
	int m_len;
	string m_str;
public:
	Dumy(string str):m_str(str),m_len(str.length()){}
};
  • 类中的成员变量叫声明,在类创建对象的时候才会定义成员变量。

初始化列表的必要性

  • 类中包含常量和引用型的成员变量时,必须通过构造函数的初始化列表显式的对其进行初始化。

  • 在子类中显式的构造其基类部分的时候需要使用初始化列表的方式。

/*
    初始化列表的必要性initialize.cpp
*/
#include <iostream>

using namespace std;

class User {
private:
    const int m_id;
    int &m_age;
public:
    User(int id,int age):m_id(id),m_age(age) {
        //这里初始化失败,因为在此之前已经被初始化
        //m_id = id;
        //m_age = age;
    }
    void show(void) {
        cout << '(' << m_id << ',' << m_age << ')' << endl;
    }
};

int main(void) {
    User uesr(101,20);
    return 0;
}