• C++——构造函数


    定义

    构造函数是一个特殊的成员函数,名字和类名相同,创建类类型对象时由编译器自动调节,保证每个数据成员都有一个合适的初始值,并且在对象的声明周期内只调用一次。

    特性

    1.函数名和类名相同

    2.无返回值

    3.对象实例化时编译器自动调用对应的构造函数

    4.构造函数可以重载(本质就是,我们可以写多个构造函数,提供多种初始化方式)

    class Date

    {

    public:

             Date()                                                //无参构造函数

                    {

                                _year = 1;

                                _month = 1;

                                _day = 1;

                    }

            Date(int year, int month, int day)        //有参构造函数

                    {

                            _year = year;

                            _month = month;

                            _day = day;

                    }

    private:

                    int _year;

                    int _month;

                    int _day;

    };

    void TestDate()

            {

                    Date d1;                       //定义一个Date对象的时候自动调用无参构造函数

                    Date d2(2007,7,20);    //自动调用有参的构造函数(有参函数调用时,参数写在对象后面,而不是函数的后面)

               

                  Date d3();                //因为编译器分不清这是在定义新的函数还是在调用函数,所以会报错,不可以这样写!    

            }

    全缺省参数

    1.全缺省参数和无参的构造函数、我们没写编译器默认生成的都称为默认构造函数(我们不写,编译器会自动生成),并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。

    //默认构造函数

    class Date

    {

    public:

             Date()                                                

                    {

                                _year = 1;

                                _month = 1;

                                _day = 1;

                    }

            Date(int year = 1, int month = 1, int day = 1)      

                    {

                            _year = year;

                            _month = month;

                            _day = day;

                    }

    private:

                    int _year;

                    int _month;

                    int _day;

    };

    void TestDate()

            {

                   Date d1;//调用产生歧义

            }

    所以全缺省函数和无参构造函数在语法上可以同时存在,但是调用时会产生歧义,这时我们会选择保留全缺省函数(灵活:想传几个参数就传几个参数,不传参时可视为无参构造函数,全传时可视为有参构造函数)

    2.缺省参数可以避免栈的扩容

    我们知道realloc扩容,有可能是原地扩容,也有可能是异地扩容。而异地扩容的代价也是比较大的。不光要找一个更大的空间,还要把原来的数据进行拷贝。所以缺省参数对栈来说还是很好用的。

    Stack(size_t n = 4)//栈的无参构造函数改造
        {
            if (n == 0)
            {
                capacity = top = 0;
                a = nullptr;
            }
            else
            {
                a = (int*)malloc(sizeof(int) * n);
                if (a == NULL)
                {
                    perror("malloc fail::");
                    return;
                }
                capacity = n;
                top = 0;
            }
        }

    默认构造函数

    编译器生成的默认构造函数的特点:

    1.我们不写才会生成一个无参的构造函数,我们写了任意一个构造函数,无参构造函数就不会生成了。(所以写了有参构造函数之后,也要写上无参构造函数)

    写了这一个半缺省的函数,那么该类的无参构造函数就算你没写,也不会自动生成了。除非你一个构造函数都没写。

    2.内置类型的成员不会处理  

    3.自定义类型的成员才会处理,会去调用这个成员的构造函数

    总结:一般情况下,都需要我们自己写构造函数,决定初始化的方式。除非,这个类的成员变量全是自定义类型。

  • 相关阅读:
    OceanBase 单机租户最多能支持多少分区?
    springboot奥运会志愿者管理系统
    java计算机毕业设计物流信息管理系统录像演示源码+系统+数据库+lw文档+mybatis+运行部署
    Harbor断电重启postgres报错 could not locate a valid checkpoint record
    Windows安装linux子系统
    RK3568 gpio 复用控制使用操作记录
    docker(学习第一天)
    hystrix 熔断器
    MySQL日志管理、备份与恢复
    Packet Tracer - 配置多区域 OSPFv3
  • 原文地址:https://blog.csdn.net/m0_62159976/article/details/132979129