码迷,mamicode.com
首页 > 编程语言 > 详细

c++构造函数详解

时间:2015-07-17 00:30:18      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

一、Default constructor

1.       对于class X ,如果没有任何user-declared constructor,那么编译器生成的default constructor是无用的

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

   .带有default constructormember class object

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

   .带有default constructorbase class

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

   .带有一个virtual funtionclass

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

   .带有一个virtual base classclass

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;

这种情况下yogivptr值拷贝给winnervptr是安全的,也就说此时两个对象的vptr完全一样。

但是下面这种情况

ZoonAnimal franny = yogi;

此时frannyvptr不可以被设定指向Bear classvirtual table。也就说合成出来的ZoonAnimal copy constructor会明确设定objectvptr指向ZoonAnimal classvirtual table,而不是直接从右手边的class object将其vptr现值拷贝过来

 

三、成员初值列(member initialization list

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

 当初始化一个reference member

 当初始化一个const member

 当调用一个base classconstructor,而它拥有一组参数时

 当调用member classconstructor,而它拥有一组参数时

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

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

c++构造函数详解

标签:

原文地址:http://blog.csdn.net/lqlblog/article/details/46919363

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!