• 【M4】非必要不提供default 构造方法


    1、default 构造方法意味着,没有外来信息的情况下,进行初始化,构造出一个对象。对于有些对象是很合理的,比如数值之类的对象,可以初始化为0;对于指针之类的对象,初始化为null;对于集合如vector,list,可以初始化为一个空容器。

    2、对于有些对象,必须要有外来信息,才能构造出一个有意义的对象。比如Person,要有name才能构造出一个有意义的Person对象。

    3、因此,对于没有外来信息,也能合理构造出一个对象的类,必须提供default 构造方法。对于没有外来信息,不能构造出一个对象的类,不能有default构造方法。

    4、现在考虑,没有default构造方法,使用类会有哪些限制?

    5、第一个限制:使用数组的时候,没有显式调用构造方法,只是指定大小。这种情况下,调用default构造方法,因此出错。如下:

      Person pArray[10]; // 错误

      Person* pArray = new Person[10]; // 错误

    6、对于栈上的数组,解决办法是:Person pArray = {Person("Andy"), Person("Bill"), ....}; 但是这种办法无法解决堆上的数组。

    7、堆上的数组,可以使用“指针数组”,而不是“对象数组”。如下:

      Person* pArray = new Person* [10];

      for(int i=0;i<10;++i)

      {

        pArray[i] = new Person("Andy");

      }

    8、使用数组指针,有两个问题:a、需要手工delete指针;b、使用的内存变大,需要一些内存保存指针,还需要一些内存保存对象。有没有解决办法呢?

      可以使用placement new,先分配好内存,然后在内存上构造对象。注意:由于这些内存不是new operator分配出来的,而是已经事先分配好的。不能使用delete [],因为delete[] 析构对象,并且释放内存,而这些内存别人可能还在使用。因此,只需要逐个析构对象。

    9、没有default 构造方法,第二个限制是,将不适用于模版。这个很好理解,模版中经常会使用T t。

    10、没有default构造方法,第三点限制是子类构造方法需要显式调用父类的构造方法,初始化父类的字段。子类构造方法先调用父类构造方法,初始化父类字段。如果在初始化列表中,没有显式调用父类构造方法,将隐式调用父类的default 构造方法。因此,如果父类没有default 构造方法,子类构造方法必须显式调用父类其他的构造方法,否则编译出错。

    11、没有default 构造方法,类的使用受到限制。但是,添加无意义的default 构造方法,也不合理。因此,除非有需要,才添加default构造方法。

  • 相关阅读:
    Object上的静态方法
    【php实现数据结构】单向链表
    图片上传方案详解
    新手必踩坑之display: inline-block
    前端算法题:找出数组中第k大的数字出现多少次
    this的五种指法
    通过java反射实现的excel数据导出
    算法系列-动态规划(4):买卖股票的最佳时机
    算法系列-动态规划(3):找零钱、走方格问题
    数据库仓库系列:(一)什么是数据仓库,为什么要数据仓库
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3577147.html
Copyright © 2020-2023  润新知