您现在的位置是:群英 > 开发技术 > 编程语言
C++构造函数的作用是什么,怎样使用?
Admin发表于 2021-12-20 17:47:551148 次浏览

    这篇文章给大家分享的是关于C++构造函数的相关内容,下文介绍了C++构造函数的作用、用法口具体的使用示例,对大家学习和理解C++构造函数有一定参考价值,感兴趣的朋友接下来一起跟随小编看看吧。

    1.作用

    一种特殊类型的方法,在每次实例化对象时运行

    2.代码举例

    2.1 示例1:

    #include <iostream>
    class A
    {
        public:
            float a, b;
            void print()
            {
                std::cout << a <<  " ,  " << b << std :: endl;
            }
    };
    int main()
    {
        A a;
        a.print();
        return 1;
    }
    

    运行结果:


    当我们实例化A,系统为它分配内存,我们没有初始化内存,得到的是内存空间原有的那些东西

    2.2 示例2:

    当在main中添加 std::cout << a.a << " , " << a.b << std :: endl;

    int main()
    {
        A a;
        std::cout << a.a <<  " ,  " << a.b << std :: endl;
        a.print();
        return 1;
    }
    

    (ubuntu下 vs code )运行结果

    不同编译器可能不一样,有的会编译不过报错(未初始化局部变量),原因有待深入…

    3. 使用

    3.1 使用构造函数初始化

    #include <iostream>
    class A
    {
        public:
            float a, b;
            A ()
            {
                a = 0.0f;
                b = 0.0f;
            }
            void print()
            {
                std::cout << a <<  " ,  " << b << std :: endl;
            }
    };
    int main()
    {
        A a;
        std::cout << a.a <<  " ,  " << a.b << std :: endl;
        a.print();
        return 1;
    }
    

    结果:

    3.2 有参数的构造函数

    #include <iostream>
    class A
    {
        public:
            float a, b;
        // 无参构造
        A ()
            {
                a = 0.0f;
                b = 0.0f;
            }
        // 有参构造
            A(float c,float d)
            {
                a = c;
                b = d;
            }
        
            void print()
            {
                std::cout << a <<  " ,  " << b << std :: endl;
            }
    };
    int main()
    {
        A a(5.0,6.0);
        std::cout << a.a <<  " ,  " << a.b << std :: endl;
        a.print();
        return 1;
    }
    

    一个类可以有很多构造函数 前提是参数个数不同或者参数类型不同

    类似于同名函数(函数重载 即有相同的函数名,但是有不同的参数个数与参数类型)

     A(float c,float d)
     {
     }
    A(int c,int d)
    {
    }
    A(float c,float d,float e)
    {
    }
    

    这里需要注意有参构造的时候注意传值类型

    float 类型

    A a(5.0f , 6.0f);
    

    3.3 默认的构造函数

    每个类默认有一个空参空实体的构造函数(如果写了构造函数,则默认构造函数就没有了,需要时需手动添加)

    A ()
    {
    }
    

    如果不想使用构造函数有两种方法

    // 1 私有化
    private :
    	A(){}
    // 2 删掉
    A() = delete;
    

    4. 成员初始化列表

    例1:正常初始化

    #include <iostream>
    using namespace std;
    class Student
    {
    private:
        const char *m_name;
        int m_age;
        float m_score;
    public:
        // 无参构造 给变量赋定值
        Student()
        {
            m_name = "aaa";
            m_age = 1;
            m_score = 99.0;
        }
        // 有参构造  给变量动态赋值
        Student(const char *name, int age, float score)
        {
            m_name = name;
            m_age = age;
            m_score = score;
        }
        void print ()
        {
            cout << m_name << " ," << m_age  <<  " ," <<  m_score << endl;
        }
    };
    int main(int argc, char const *argv[])
    {
        Student s1;
        s1.print();
        Student s2("ccc" , 2 , 99.3f);
        s2.print();
        return 0;
    }
    

    例2:成员初始化列表

    #include <iostream>
    #include <string>
    using namespace std;
    class Student
    {
    private:
        // string m_name;
        // char *m_name;
        const char *m_name;
        int m_age;
        float m_score;
    public:   
        //  无参 成员初始化列表  
        Student() 
            : m_name("bbb") , m_age(2) , m_score(93.0f) 
        {
            // TODO
        }
        // 有参 成员初始化列表  
        /**
         *  const char *name    常量指针     const 修饰*name   *name不可改变
         *  char * const name   指针常量     const 修饰 name   name不可改变
         *  char const *name    常量指针 等同于 const char *name 
         * 
         *  这里不写const 会报警告  但可以编过  
         *  
        */
        Student(const char *name, int age, float score)
            : m_name(name) , m_age(age) , m_score(score)
        {
           // TODO
        }
        void print ()
        {
            cout << m_name << " ," << m_age  <<  " ," <<  m_score << endl;
        }
    };
    int main(int argc, char const *argv[])
    {
        Student s1;
        s1.print();
        Student s2("ccc",2,99.3f);
        s2.print();
        return 0;
    }
    

    运行结果都一样:

    aaa ,1 ,99
    ccc ,2 ,99.3

    使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。

    初始化列表可以用于全部成员变量,也可以只用于部分成员变量

    Student(char *name, int age, float score): m_name(name){
        m_age = age;
        m_score = score;
    }
    

    NOTE:成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。

    为啥推荐成员初始化列表的写法?

    #include <iostream>
    using namespace std;
    class Example
    {
    public:
        Example()
        {
            cout<< "Create Example" << endl;
        }
        Example(int x)
        {
            cout<< "Create Example with "  << x << endl;
        }
    };
    class A
    {
    private:
        string m_name;
        // 创建了 Example 的无参构造 对象
        Example m_Example;
    public:
        A()
        {
            m_name = "name";
            // 创建新的有参构造对象覆盖第一次赋值  
            m_Example = Example(1);
        }
    };
    int main(int argc, char const *argv[])
    {
        A a;
        return 0;
    }
    

    结果:

    A的构造函数换成成员初始化列表的写法

    //    A() : m_name ("name"),m_Example(Example(1))  		与下面写法相同
    A() : m_name ("name"),m_Example(1)
        {
        }
    

    结果:

    总结

        现在大家对于C++构造函数的作用和使用这些应该都有所了解了,希望大家阅读完这篇文章能有所收获。最后,想要了解更多C++构造函数的内容,大家可以关注群英网络其它相关文章。

    文本转载自PHP中文网

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

    标签: c 构造函数
    相关信息推荐
    2022-02-25 17:19:26 
    摘要:Python中如何求阶乘?Python中要实现求阶乘的方法有很多,这篇给大家介绍四个方法,分别是使用for循环、使用reduce()函数、使用factorial()函数和使用递归调用。文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
    2022-05-11 11:59:50 
    摘要:这篇文章主要介绍了PHP中的变量覆盖漏洞深入解析,文中对于变量覆盖漏洞的理解很透彻,有感兴趣的同学可以研究下
    2022-08-19 17:50:27 
    摘要:这篇文章主要为大家介绍了python编程中如何使用PyQt创建UE蓝图的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    云活动
    推荐内容
    热门关键词
    热门信息
    群英网络助力开启安全的云计算之旅
    立即注册,领取新人大礼包
    • 联系我们
    • 24小时售后:4006784567
    • 24小时TEL :0668-2555666
    • 售前咨询TEL:400-678-4567

    • 官方微信

      官方微信
    Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
    增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
    免费拨打  400-678-4567
    免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
    微信公众号
    返回顶部
    返回顶部 返回顶部