在什么情况下系统会自动生成缺省(默认)的构造函数?

1、在类里面有一个类类型的对象,这个类有自己的缺省构造函数(有缺省的参数,参数有缺省值)。

class B

{

B(int data)

{ }

};不能合成

class B

{

B(int data=0)

{ }

};会合成

classB

{

public:

B(intdata=0)

{}

};

classC:publicB

{

public:

C()

:B(0)

{}

Bb;//编译器会自动合成

};

2、类是虚拟继承

classB

{

public:

B()

{}

};

classD:virtualpublicB

{

public:

D()

{}

Bb;

};

3、基类有缺省构造函数,子类没有显示定义自己的构造函数

classB

{

public:

B(intdata=0)

{}

};

classD:publicB

{

public:

};


4、有虚函数的类,系统自动生成缺省的构造函数来初始化虚指针

classB

{

public:

virtualvoidfun()

{

cout<<"fun"<<endl;

}

};

前面是一些构造函数方面的总结,菜鸟一个写的太烂,进来的先凑合着看,会不定时补充,有错误的地方还请多多指点

****************************************************************************************

虚函数:

classBase

{

public:

virtualvoidFunTest()

{

cout<<"Base::FunTest()"<<endl;

}

virtualvoidFunTest1()

{

cout<<"Base::FunTest1()"<<endl;

}

virtualvoidFunTest2()

{

cout<<"Base::FunTest2()"<<endl;

}

virtualvoidFunTest3()

{

cout<<"Base::FunTest3()"<<endl;

}

virtualvoidFunTest4()

{

cout<<"Base::FunTest4()"<<endl;

}

};

intmain()

{

Baseb;

system("pause");

return0;

}

Baseb;

009253E8leaecx,[b]

009253EBcallBase::Base(0921226h)

有call命令说明编译器有合成缺省构造函数

取b的地址,b指向的那块空间里存放着另一个地址,该地址指向的空间存放着虚表地址

虚指针指向虚表

虚表的顺序和函数的声明顺序是一样的

虚函数的大小:

***************************计算大小*********************************

class C

{

public:

char a; //1

static char b; //静态成员在静态区域,不在栈区,所以不算

void *p; //指针占4个字节

static int *c; //静态成员在静态区域,不在栈区,所以不算

virtual void func1()

{}

virtual void func2()

{}

//虚函数属于同一类,故只需要一个这个指针指向虚函数表,

//占用4个字节,就算有N个虚函数,也是4个字节

};


int main()

{

C c;

cout << sizeof(C) << endl; //12

cout << sizeof(c.a) << endl; //1

cout << sizeof(c.b) << endl; //1 类型的大小

cout << sizeof(c.c) << endl; //4 类型的大小

cout << sizeof(c.p) << endl; //4

return 0;

}