一构造函数概述:
(一)构造函数:
*调用一个base class的constructor,而它拥有一组参数。(constructor包括:构造函数和复制构造函数)
*调用一个member class的constructor,而它拥有一组参数。
(一)两个误解:
(1)任何class如果没有定义default constructor就会合成一个。错错错!!!(Default Copy Constructor一样)
(2)编译器合成的default constructor会明确设定"class内每一个data member的默认值"。错错错!!!(Default Copy Constructor会复制其他的,如整数、指针、数组等等)。
(二)何时编译器会合成default constructor的两种说法(意思一样):
(1)ARM:当编译器需要的时候,并且合成的default constructor只满足编译器的需要。
*程序需要:由程序员完成。
*编译器需要:由编译器完成,并只满足编译器的需要,不理会程序需要。
(2)C++ Standard:当default constructor是nontrivial时,编译器会合成default constructor,合成的default constructor只满足编译器需要。
*编译器合成的default constructor中,只有base class subobjects和member class object会被初始化,所有其他non-static data member如:整数、整数指针、整数数组等都不会被初始化。
*trivial default constructor,实际上不会被合成出来。
(3)满足"编译器需要"的方法:
*合成default constructor.
*如果程序员自己定义了default constructor,则编译器会扩充已存在的constructor,在其中安插一些代码(满足编译器需要的代码),使得在user code被执行之前,先调用必要的代码满足编译器需要。
(三)是default nontrivial constructor的四种情况(即编译器会合成default constructor):
(1)"带有Default constructor"的Member Class Object。
(2)派生自"带有Default Constructor"的base class。
(3)"带有或继承一个Virtual Function"的class:编译器为object的vptr设定初值,放置适当的virtual table的地址。
(4)class派生自一个继承链,其中含有一个或多个virtual base classes:编译器安插"允许每一个virtual base class的执行期存取操作"的码。