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构造方法。

【M4】非必要不提供default 构造方法的更多相关文章

  1. 【More Effective C++ 条款4】非必要不提供default constructor

    1)default constructor:在没有任何外来信息的情况下将对象初始化 2)但是有些对象如果没有外来信息,就没有办法完成初始化动作,那么这些对象,就没有必要提供default constr ...

  2. Java类加载信息的顺序:包括静态代码快、静态类变量、非静态代码快、构造方法、普通方法

    JVM运行之前会执行一个叫做类加载器的子系统,叫做ClassLoader,那么类里面那么多“元素”,究竟是个什么顺序呢,写几行代码测试一下,通过给每个方法和代码快和静态变量打上断点来测试: class ...

  3. VS中为非控制台程序提供控制台输出窗口

    /************************************************************************/ /* 模块名:ConsoleAdapter 文件名 ...

  4. Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

    子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A ...

  5. c++interview

    出自:https://github.com/huihut/interview Github    |    Docsify 简体中文    |    English 关于 本仓库是面向 C/C++ 技 ...

  6. More Effective C++ (1)

    简单分析总结了more effective c++ 的前十个条款: 剩下的条款to be continue~ 1.仔细区分指针和引用引用必须不能指向空,指针可以指向空,指针初始化是记得赋空值,重载某些 ...

  7. C++ 构造过程和析构过程

    1.C++构造和析构的过程,类似于穿衣脱衣的过程.穿衣是:先穿内衣,再穿外套.脱衣是:先脱外套,再脱内衣.C++构造过程:首先调用父类构造方法,再调用子类构造方法.C++析构过程:首先调用子类析构方法 ...

  8. ###《More Effective C++》- 基础议题

    More Effective C++ #@author: gr #@date: 2015-05-11 #@email: forgerui@gmail.com 一.仔细区别pointers和refere ...

  9. C++ Primer 5th 第7章 类

    类的基本思想是数据抽象和封装,定义类就是定义一个抽象数据类型. 类中的所有成员必须在类中声明,也即默认定义在类中的成员全部为声明,除非显式的定义成员函数的函数体.成员函数是在类中声明的,定义可以在类内 ...

随机推荐

  1. RTP头结构解析

    RTP包头前12个固定字节机构图: 0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 ...

  2. 搜集的一些RTMP项目,有Server端也有Client端

    查询一些RTMP的协议封装时找到了一些RTMP开源项目,在这里列举一下,以后有时间或是有兴趣可以参考一下: just very few of them. Red5 only contains a se ...

  3. 使用solrj操作solr索引库

    (solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有 ...

  4. 【windows核心编程】DLL相关(1)

    DLL相关的东西 1.DLL的加载方式 隐式: #pragma comment(lib, "XX.lib"); 编译器去查找名为XX.dll的DLL,除了名字相同,该DLL和该LI ...

  5. C++指针的引用

    [1]指针的引用,必须加上头文件<iomanip>因为调用类setw() 对一个数据可以使用“引用”(reference)这是C++           对C的一个重要扩充,引用是一种新的 ...

  6. cocos2d-x 详解之 CCLayer(触摸事件)

    CCLayer继承自CCNode,在CCLayer中可以实现单点触摸.多点触摸和重力感应回调3种不同形式的交互.这部分的难点在于,当存在多个层都要去接收触摸时它的响应机制是如何处理的.了解内部的处理机 ...

  7. Java内部类this$0字段产生的一个bug

    首先查看下面一段代码,我指出了问题代码的所在,读者先自己思考一下这段代码会有什么问题. 这是用clone方法完整拷贝一个二项堆(BinomialHeap)结构的代码.二项堆中包含一个内部类Binomi ...

  8. A题进行时--浙大PAT 1011-1020

    #include<stdio.h> #include<string.h> int main(){ ]; ]; ]; ]; ]; int i; float sum; memset ...

  9. GridView控件 Reapter控件 DataList控件 的区别和用法

    ASP.NET三大控件: 1.GridView控件:表格视图控件,可以用来绑定结果集或者视图,用起来比较方便和灵活,三个控件中使用最多的控件 用法--- this.gridview1.DataSour ...

  10. 教你区分LVDS屏线及屏接口定义

    现在碰到液晶屏大多是LVDS屏线,经常碰到什么单6,双6 单8双8.如何区分呢?我以前也不知道,后在网上收集学习后才弄明白方法1数带 “ -”的这种信号线一共有几对,有10对的减2对就是双8,有8对的 ...