zoukankan      html  css  js  c++  java
  • 构造函数初始化列表

    对于一个类,我们需要给他赋初值,这时候构造函数就起到了这个作用,构造函数在类实体被建立的那一刻起就被调用并且给类赋上了初值,下面为类写两个构造函数

    #include<iostream>
    #include<string>
    
    class Entity
    {
    private:
        std::string m_Name;
    public:
        Entity()
        {
            m_Name = "Unknow";
        }
        Entity(const std::string& name)
        {
            m_Name = name;
        }
        const std::string &GetName()const
        {
            return m_Name;
        }
    };
    
    int main()
    {
        Entity e0;
        std::cout << e0.GetName() << std::endl;
    
        Entity e1("Wangtn");//因为传入的数据时常量字符串,所以构造函数的输入也应该是const类型
        std::cout << e1.GetName() << std::endl;
    
        std::cin.get();
    }

    可以看到打印结果

     另外一种初始化方法是通过构造函数初始化链表来完成

    #include<iostream>
    #include<string>
    
    class Entity
    {
    private:
        std::string m_Name;
    public:
        Entity()
            :m_Name("Unknow")
        {
        }
        Entity(const std::string& name)
            :m_Name(name)
        {
        }
        const std::string &GetName()const
        {
            return m_Name;
        }
    };
    
    int main()
    {
        Entity e0;
        std::cout << e0.GetName() << std::endl;
    
        Entity e1("Wangtn");//因为传入的数据时常量字符串,所以构造函数的输入也应该是const类型
        std::cout << e1.GetName() << std::endl;
    
        std::cin.get();
    }

    注意构造函数初始化链表的格式,而且当类中有多个成员变量时,使用构造函数初始化链表进行初始化时要按照变量的顺序来,而且如果有多个构造函数,所有的构造函数初始化变量的顺序必须相同。

    #include<iostream>
    #include<string>
    
    class Example
    {
    public:
        Example()
        {
            std::cout << "Create Entity" << std::endl;
        }
        Example(int x)
        {
            std::cout << "Create Entity with" << x <<"!"<< std::endl;
        }
    };
    class Entity
    {
    private:
        std::string m_Name;
        int x, y, z;
        Example m_Example;//1
    public:
        Entity()
        {
            m_Name = "Unknow";
            m_Example = Example(8);//2
        }
        Entity(const std::string& name)
        {
            m_Name = name;
        }
        const std::string &GetName()const
        {
            return m_Name;
        }
    };
    
    int main()
    {
        Entity e0;
    
    
        std::cin.get();
    }

    上面代码可以看到,我只新建了一个实体类Entity e0,但是却是用了两次Example的构造函数,也就是说Example这个类被创建了两次,第一次和第二次创建如程序注释所标注,如果使用构造函数初始化链表

    #include<iostream>
    #include<string>
    
    class Example
    {
    public:
        Example()
        {
            std::cout << "Create Entity" << std::endl;
        }
        Example(int x)
        {
            std::cout << "Create Entity with" << x <<"!"<< std::endl;
        }
    };
    class Entity
    {
    private:
        std::string m_Name;
        int x, y, z;
        Example m_Example;
    public:
        Entity()
            :m_Example(Example(8))//:m_Example(8)
        {
            m_Name = "Unknow";
        }
        Entity(const std::string& name)
        {
            m_Name = name;
        }
        const std::string &GetName()const
        {
            return m_Name;
        }
    };
    
    int main()
    {
        Entity e0;
    
    
        std::cin.get();
    }

    可以看到Example只建立了一次,注释后的写法结果是一样的。所以结论就是没有理由不使用构造函数初始化链表,他可以简化代码,节约资源,并且不会出错

  • 相关阅读:
    vue ui 没反应
    vue脚手架安装教程
    DOS命令如何进入指定文件夹
    python-格式化(%,format,f-string)输出+输入
    Python基础-列表、元组、字典、字符串(精简解析)
    python中的lambda函数用法
    初识JAVA
    关于继承、封装、多态、抽象和接口(Java)
    Python中单下划线和双下划线
    Postgresql 创建SEQUENCE,Springboot中使用KeyHolder
  • 原文地址:https://www.cnblogs.com/wangtianning1223/p/12746077.html
Copyright © 2011-2022 走看看