构造函数初始化列表tips

构造函数初始化列表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)
{
    .....
}

原文链接: https://www.cnblogs.com/runner42/archive/2013/01/07/2848961.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    构造函数初始化列表tips

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/74812

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午4:34
下一篇 2023年2月9日 下午4:35

相关推荐