首页 > 代码库 > c++构造函数具体解释

c++构造函数具体解释

一、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++构造函数具体解释