首页 / C++ / c++构造函数具体解释
c++构造函数具体解释
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c++构造函数具体解释,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2427字,纯文字阅读大概需要4分钟。
内容图文
一、 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 之前。
原文:http://www.cnblogs.com/brucemengbm/p/6715411.html
内容总结
以上是互联网集市为您收集整理的c++构造函数具体解释全部内容,希望文章能够帮你解决c++构造函数具体解释所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。