c++构造函数具体解释
一、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++构造函数具体解释的更多相关文章
- C++拷贝构造函数具体解释
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是非常easy的,比如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各 ...
- 【c++类的构造函数具体解释
】
一.构造函数是干什么的 class Dog { public: // 类Dog的构造函数 // 特点:以类名作为函数名,无返回类型 Dog() ...
- HashMap源码之构造函数--JDK1.8
构造函数 变量解释 capacity,表示的是hashmap中桶的数量,初始化容量initCapacity为16,第一次扩容会扩到64,之后每次扩容都是之前容量的2倍,所以容量每次都是2的次幂 loa ...
- JQ对象到底是什么
jQuery对象是什么,举个例子,$('#id') 返回的就是jQuery对象,这个东西是整个jQuery的核心所在,所以我先来分析它. var jQuery = function( selector ...
- android 音频采集1
声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量. 假设某通道的音频信号是采样率为8kHz,位宽为16bit,20ms一帧,双通道,则一帧音频数据的大小为: int size = 8000 ...
- JavaScript编码规范[百度]
JavaScript编码规范 1 前言 2 代码风格 2.1 文件 2.2 结构 2.2.1 缩进 2.2.2 空格 2.2.3 换行 2.2.4 语句 2.3 命名 ...
- 传统的Ado.net 参数设置:params SqlParameter[] commandParameters
C#代码 ExecuteReader(string connectionString, CommandType commandType, string commandText, params Sql ...
- 【转】实现展开列ExpandableListView的三种方式之SimpleExpandableListAdapter实例
原文网址:http://blog.csdn.net/x605940745/article/details/12099709 实现可扩展展开列ExpandableListView的三种方式 欢迎加入QQ ...
- C++ Primer 5th 第9章 顺序容器
练习9.1:对于下面的程序任务,vector.deque和list哪种容器最为适合?解释你的选择的理由.如果没有哪一种容器优于其他容器,也请解释理由.(a) 读取固定数量的单词,将它们按字典序插入到容 ...
随机推荐
- SlickSafe.NET 开源权限框架开发指南
前言:本文适用于快速搭建权限系统的用户,尤其适用于希望有良好定义的权限模型建立:系统解决方案是在基于角色访问控制(RBAC)策略基础上的权限访问模型实现,主要完成了后台权限验证逻辑和前端权限数据验证的 ...
- 忘记Oracle系统管理员sys的密码
sqlplus / as sysdba; alter user sys identified by newpwd***;
- ThinkPHP中I('post.')与create()方法的对比
简要归纳: 1.二者都可用来接收post表单提交的数据. 2.I('post.')方法可直接接收赋值给变量如$post=I('post.'),create()方法源于父类模型封装,需先实例化父类模型, ...
- Flash Builder 4的快捷方式和调试技巧
Flash Builder 4的快捷方式和调试技巧 来自于flex开发人员中心:http://www.adobe.com/cn/devnet/flex/articles/flashbuilder_sh ...
- Thinkpad T440p安装Linux的种种问题(by quqi99)
作者:张华 发表于:2014-05-08 版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99 ) Thi ...
- .NET的堆和栈03,引用类型对象拷贝以及内存分配
在" .NET的堆和栈01,基本概念.值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配.我们知道:当执行一个方法的时 ...
- RESTful学习文档
视频讲解 http://www.tudou.com/programs/view/PaVOGeK_BOY/ 文档说明 http://www.csdn.net/article/2013-06-13/281 ...
- linux 监控CPU 内存情况
htop
- 我所遭遇过的游戏中间件---nvDXTLib
我所遭遇过的游戏中间件---nvDXTLib nvDXTLib是Nvidia提供的一套用于DXT纹理压缩SDK.接口十分简洁,就是提供了几个纹理压缩的函数,其中我使用最多的函数是: DXTLIB_AP ...
- [15] 星星(Star)图形的生成算法
顶点数据的生成 bool YfBuildStarVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint slices, YeO ...