• 构造函数初始化列表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)
    {
        .....
    }
    
  • 相关阅读:
    php 微信-支付宝APP支付(退款)参数获取
    宝塔面板下安装svn版本管理(Centos)
    获取上传文件浏览器路径
    PHP 自制简易其它网站调用密文加密解密
    获取嵌入的资源
    设计模式02(结构性设计模式)
    人为控制随机概率
    设计模式01(创建性设计模式)
    插件式开发
    使用Word2010直接编辑、发布博客→博客园cnblogs
  • 原文地址:https://www.cnblogs.com/runner42/p/2848961.html
Copyright © 2020-2023  润新知