创建一个类的对象时,编译器为对象分配内存空间,调用该类的构造函数。
构造函数的目的:完成对象非静态成员的初始化工作。
(静态成员初始化:类外进行,默认值为0,在程序开始时,主函数之前,单线程方式,主线程完成)
若构造函数有初始化列表,先按成员声明顺序(非初始化列表中顺序)执行初始化列表中内容,然后进入构造函数体。
如果类本身没有非虚拟的基类,应显示的调用直接基类的某个构造函数,否则会自动其直接基类的默认构造函数(直接基类没有默认构造函数报错);
如果类本身有虚拟基类,也应显示的调用虚拟基类的某个构造函数,否则调用基类的默认构造函数。如果成员中出现其他的类对象,显示的调用成员所属类的相应构造函数,否则对于没有出现在初始化列表中的类成员,也会调用其默认构造函数。
调用顺序:首先完成包含自身的“祖先对象”的初始化,完成自身包含的成员是其他类型(客人)的初始化,最后自身非类类型成员的初始化。
编译器会产生默认构造函数的情况:
1)该类,该类的基类或该类中定义的类类型成员对象中,有虚函数存在。
必须要完成对对象的虚表初始化工作
虚表指针初始化,在构造函数初始化列表之后,进入构造函数体代码之前。
2)该类、该类的基类所定义的类类型成员对象中带有构造函数
发生这种情况时,由于需要显式地调用这些类类型成员的构造函数,编译器在没有任何构造函数的时候,也会产生一个默认构造函数来完成这个过程;同样,如果你已经定义一个构造函数但没有对这些类类型成员显式调用构造函数,编译器则把这部分工作“合成”到你定义的构造函数中(调用它们的默认构造函数,再次用心良苦)。
3)该类拥有虚基类
构造函数中有虚特性(动态、动态绑定、晚绑定)产生吗?
C++中,没有虚特性产生
派生类总是要调用一个基类的构造函数(无论是显式调用还是由编译器隐式地调用默认构造函数,因为这里讨论的是有虚函数的情况,所以一定会有基类构造函数产生并调用),而此时,在基类构造函数中,派生类对象根本没有创建,也就是说,基类根本不知道派生类中产生了override,即多态,故没有虚特性产生。
不要在构造函数内调用其它的虚成员函数,否则,当这个类被继承后,在构造函数内调用的这些虚成员函数就没有了虚特性(丧失多态性)。(非虚成员函数本来就没有多态性,不在此讨论范围)
构造函数中调用构造函数,析构函数
不行
构造函数中的异常
尽可能不要在构造函数中产生(抛出)异常,否则,一定会产生问题。
原文:伯乐在线->你不知道的构造函数