一、Default constructor

1.       对于class X ,假设没有不论什么user-declared
constructor,那么编译器生成的default constructor是没用的

2.       编译器合成(扩张)的default constructor 是实用的4中情况

①.带有default constructor的member
class object

Member class object 的Default constructor会在合成(扩张)的default
constructor调用。

②.带有default constructor的base
class

合成(扩张)的default constructor会调用base class的default
constructor

③.带有一个virtual funtion的class

合成(扩张)的default constructor会初始化类的vptr

④.带有一个virtual base class的class

3.       误区

①.不论什么class假设未定义default
constructor,就会被合成出来。

②.编译器合成出来的default constructor 会被明白设定class内的每个data
member的默认值。

二、Copy constructor

1.       有三种情况,会以一个object的内容作为还有一个class的初值。

①.明白的以一个object的内容作为还有一个class
object的初值 X xx = x;

②.当object被当作參数交给某个函数时 void
foo(X x)

③.当函数传回一个class object   x = foo() { return
xx;}

假设定义了copy constructor则大多数情况下会被调用,否则其内部是以所谓的default memberwise initialization 手法完毕,对于当中member
class object是以递归方式施行memberwise initialization。

2.       编译器会合成copy constructor的情况即class不表现出bitwise
copy semantics

①.当class内含一个member
object而后者的class声明有一个copy constructor时(具备条件合成的)

②.当class继承自一个base
class而后者存在有一个copy constructor(被明白声明或被合成)

③.当class声明了一个或多个virtual
funtions时

④.当class派生自一个继承串链,当中有一个或多个virtual
base classes时

以下对第三点做简要说明:

我们知道编译期间的两个程序扩张操作(有virtual funtion存在的前提下)

I.添加一个virtual function table(vtbl),内含每个有作用的virtual
function的地址

II.将一个指向virtual function table的指针(vptr),安插在每个class
object内

从这两点我们能够看出编译器须要合成出一个copy constructor以求将vptr适当的初始化。

class ZooAnimal

{

public:

ZooAnimal(){}

virtual ~ZooAnimal(){}

virtual void animate(){}

virtual void draw() {}

};

class Bear : public ZooAnimal

{

public:

Bear(): b(5){memset(this, 0, sizeof(Bear));}

virtual void animate(){}

virtual void draw() {}

virtual void dance(){}//父类没有的虚函数

};

Bear yogi;

Bear winnine = yogi;

这样的情况下yogi的vptr值拷贝给winner的vptr是安全的,也就说此时两个对象的vptr全然一样。

可是以下这样的情况

ZoonAnimal franny = yogi;

此时franny的vptr不能够被设定指向Bear
class的virtual table。也就说合成出来的ZoonAnimal copy constructor会明白设定object的vptr指向ZoonAnimal
class的virtual table。而不是直接从右手边的class object将其vptr现值拷贝过来

三、成员初值列(member initialization list)

1.       为了通过编译必须使用member initialization list的情况

① 当初始化一个reference member

② 当初始化一个const member

③ 当调用一个base class的constructor,而它拥有一组參数时

④ 当调用member class的constructor,而它拥有一组參数时

初始化顺序不是有list中的项目顺序而是有member声明次序决定;编译器会一一操作initialization
list依据声明次序在constructor内安插初始化操作,而且在不论什么explicit user code之前。

c++构造函数具体解释的更多相关文章

  1. C++拷贝构造函数具体解释

    一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是非常easy的,比如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各 ...

  2. 【c++类的构造函数具体解释 】

    一.构造函数是干什么的 class Dog { public:          // 类Dog的构造函数          // 特点:以类名作为函数名,无返回类型          Dog()   ...

  3. HashMap源码之构造函数--JDK1.8

    构造函数 变量解释 capacity,表示的是hashmap中桶的数量,初始化容量initCapacity为16,第一次扩容会扩到64,之后每次扩容都是之前容量的2倍,所以容量每次都是2的次幂 loa ...

  4. JQ对象到底是什么

    jQuery对象是什么,举个例子,$('#id') 返回的就是jQuery对象,这个东西是整个jQuery的核心所在,所以我先来分析它. var jQuery = function( selector ...

  5. android 音频采集1

    声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量. 假设某通道的音频信号是采样率为8kHz,位宽为16bit,20ms一帧,双通道,则一帧音频数据的大小为: int size = 8000 ...

  6. JavaScript编码规范[百度]

    JavaScript编码规范 1 前言   2 代码风格   2.1 文件   2.2 结构   2.2.1 缩进   2.2.2 空格   2.2.3 换行   2.2.4 语句   2.3 命名 ...

  7. 传统的Ado.net 参数设置:params SqlParameter[] commandParameters

    C#代码  ExecuteReader(string connectionString, CommandType commandType, string commandText, params Sql ...

  8. 【转】实现展开列ExpandableListView的三种方式之SimpleExpandableListAdapter实例

    原文网址:http://blog.csdn.net/x605940745/article/details/12099709 实现可扩展展开列ExpandableListView的三种方式 欢迎加入QQ ...

  9. C++ Primer 5th 第9章 顺序容器

    练习9.1:对于下面的程序任务,vector.deque和list哪种容器最为适合?解释你的选择的理由.如果没有哪一种容器优于其他容器,也请解释理由.(a) 读取固定数量的单词,将它们按字典序插入到容 ...

随机推荐

  1. Android开发资料

    Android      [开发环境及工具] [控件使用及示例源码] [热更新] [开源组件] [系统内核] [错误及调试]   来自  http://www.howcode.cn ,内容不错,学习中 ...

  2. PHP自学之路---雇员管理系统(1)

    前面已经介绍了Zend studio工具的使用以及软件开发的基本阶段,下面就是我们第一个练习,雇员管理系统,从设计到实现来简单介绍下: 开发环境: 服务器:基于Linux 2.618环境下配置PHP服 ...

  3. MVC扩展生成CheckBoxList并水平排列

    本篇体验生成CheckBoxList的几个思路,扩展MVC的HtmlHelper生成CheckBoxList,并使之水平排开.     通过遍历从控制器方法拿到的Model集合 □ 思路 比如为一个用 ...

  4. 重写Html.DropDownList和Html.DropDownListFor的name属性

    □ 重写前 通常这样写: @Html.DropDownListFor(m => m.DelFlag,(List<SelectListItem>)ViewBag.d,"==请 ...

  5. TIF、JPG图片手动添加地理坐标的方法

    题目:为TIF.JPG图片添加地理坐标/平面直角坐标. 图片来源:GOOGLE EARTH.(当然也可以是其他知道四角点坐标的图片) 截图工具:GEtscreen(此软件截图时可以自动生成图片四角点坐 ...

  6. python笔记30-docstring注释添加变量

    前言 python里面添加字符串注释非常简单,如何将变量放入 python 的函数注释里面呢? docstring也就是给代码加注释的内容了,python可以给函数,类.方法,模块添加注释内容,注释标 ...

  7. svn(subversion)版本控制系统学习与理解

    定义:Apache Subversion(简称SVN,svn),一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 从这段话,我们可以得到四点信息: ...

  8. Tomcat6内存不足问题及解决方法

    1.Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行.常见的问题是报Tomcat内存溢出错误,Out of Memory(系统内存不足)的异常 ...

  9. Ip和long互转

    // <summary> /// 将127.0.0.1形式的IP地址转换成十进制整数 /// </summary> /// <param name="strIp ...

  10. Hadoop目录

    1. 通过java读取HDFS的数据 (转) 2. FLume监控文件夹,将数据发送给Kafka以及HDFS的配置文件详解 3. 开启hadoop和Hbase集群的lzo压缩功能(转) 4. Hado ...