构造函数初始化列表tips构造函数初始化列表是许多相当有经验的C++程序员都没有掌握的一个特性一、构造函数初始化列表的重要功能a)构造函数初始化列表示例如下:CHost::CHost(const string &url): m_url(url), m_ulFailCnt(0){ .....}b)普通的构造函数内部初始化如下:CHost::CHost(const string &url){ m_url = url; m_ulFailCnt = 0; ....}构造函数初始化列表其实有一个重要的功能----对变量是对象进行构造函数的初始化对于a)中,m_url在构造函数的函数体执行前,m_url用url进行了string构造函数的初始化,也就是m_url做了string::string(url),带参数的string类构造函数。对于b)中,m_url在构造函数的函数体执行前,仅仅是执行了m_url的string::string()这样的初始化(string类的默认构造函数), 然后在构造函数体内再次执行了string类的"="操作符运算m_url = url;如下:CHost::CHost(const string &url): m_url(url)//这里执行了string::string(url)的构造函数, m_ulFailCnt(0){ .....}b)普通的构造函数内部初始化如下:CHost::CHost(const string &url)//这里执行了string::string()默认的构造函数{ m_url = url;//这里执行了string的“=”操作符运算 m_ulFailCnt = 0; ....}这里不谈效率,需要关注:对于类成员是1)const类型; 2)类对象,且类无默认构造函数; 以上这两种情况必须使用构造函数初始化列表。不然肯定编译不过。二、初始化列表的顺序问题class CUser{....private: string m_strPassword; string m_strUsername; bool m_bTcpFlag;};CUser::CUser(string strUserName, string strPassword, bool bTcpFlag): m_strUsername(strUserName), m_strPassword(strPassword), m_bTcpFlag(bTcpFlag){}初始化列表的顺序只由类声明中的顺序而定,跟初始化列表中的顺序无关。因此CUser的初始化顺序是:m_strPassword;m_strUsername;m_bTcpFlag;提示:若是初始化列表顺序与类声明顺序不一致,就会导致编译器报warning,消除warning的办法,就请按照声明的顺序来排列初始化列表吧。编译时的warning主要为了防止如下事故:class X{public: X(int iVal):j(iVal), i(j)//运行时错误,因为i在j前声明,所以i(j)先执行。 { }private: int i; int j;};三、初始化列表对基类构造函数的操作CHost::CHost(const string &url): CBaseHost(url)/*这里执行基类的构造函数CBaseHost::CBaseHost(string), 而不是默认构造函数*/, m_url(url), m_ulFailCnt(0){ .....}