构造函数

来源:互联网 发布:流水账软件 编辑:程序博客网 时间:2024/05/17 23:13

一构造函数概述:

(一)构造函数

*只要创建类类型的新对象,都要执行构造函数。构造函数与类的名字相同,并且没有指定返回类型。

(二)构造函数可以被重载
1.类声明的构造函数数量没有限制,只要每个构造函数的形参表是唯一的。
2.实参决定调用哪个构造函数。
3.构造函数自动运行:只要创建一个对象,编译器就运行一个构造函数。
4.构造函数不能声明为const:创建类类型的const对象时,运行一个普通构造函数来初始化该const对象。

(三)构造函数初始化式
1.初始化式只在构造函数定义中而不是声明中指定。
2.构造函数初始化式:以一个冒号开始,接着是以一个逗号分隔的数据成员列表,每个数据成员后面跟着一个放在圆括号中的初始化式。
3.概念上说,构造函数分两个阶段执行:(1)初始化阶段;(2)普通的计算阶段(计算阶段由构造函数体中所有语句组成)。
*不管成员是否在构造函数初始化列表中显示初始化,类类型的数据成员总是在初始化阶段初始化,初始化发生在计算阶段开始之前。函数体内赋值和函数初始化式对于内置类型成本基本相同,其他大多数类型初始化比赋值高效。 
*建议常使用:构造函数初始化式。

4.有些成员必须要在构造函数初始化式中进行初始化:

*调用一个base class的constructor,而它拥有一组参数。(constructor包括:构造函数和复制构造函数)

*调用一个member class的constructor,而它拥有一组参数。

*const成员。
*引用(reference)成员。
5.成员初始化次序:类中定义成员的次序。
6.初始化式可以是任意表达式。注意:是表达式。

(四)默认构造函数
*定义:默认构造函数(default constructor)就是在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。
*只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数(编译器生成的构造函数只满足编译器的需要)。

*合成的默认构造函数:使用与变量初始化相同的规则来初始化成员。具有类类型的成员通过各自的默认构造函数进行初始化;内置和复合类型的成员,依赖于对象(类对象)的作用域:当定义在局部作用域中时,内置和复合类型不进行初始化,处于未定义状态;在全局作用域中初始化为0。

(五)最佳实践:如果定义了其他构造函数,则提供一个默认构造函数几乎总是对的。通常,在默认构造函数中给成员提供的初始值应该指出对象是“空”的。


二 构造函数深入:

(一)两个误解:

(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的执行期存取操作"的码。















原创粉丝点击