试解释为什么构造函数的重载方便了在不同情况下创建类对象?
与类名称具有一样名称的成员函数是构造函数。构造函数不能有返回值,甚至不能有return语句。说明一个有返回值的构造函数是错误的,取构造函数的地址也是错误的。
如果一个类有构造函数,在程序中每个该类类型的对象在使用之前由此构造函数进行初始化(有关初始化的更多信息参见本章后面的“用特殊成员函数进行初始化”)。
构造函数是在对象的创建点上被调用的。创建对象可以是:
* 全局对象(文件范围或外部链接的)。
* 在一个函数或者小的封闭块中的局部变量。
* 用new运算符创建的动态对象。new操作在程序的堆或自由存储区中分配一个对象。
* 因显式调用构造函数而创建的临时对象(详见本章后面的“临...全部
与类名称具有一样名称的成员函数是构造函数。构造函数不能有返回值,甚至不能有return语句。说明一个有返回值的构造函数是错误的,取构造函数的地址也是错误的。
如果一个类有构造函数,在程序中每个该类类型的对象在使用之前由此构造函数进行初始化(有关初始化的更多信息参见本章后面的“用特殊成员函数进行初始化”)。
构造函数是在对象的创建点上被调用的。创建对象可以是:
* 全局对象(文件范围或外部链接的)。
* 在一个函数或者小的封闭块中的局部变量。
* 用new运算符创建的动态对象。new操作在程序的堆或自由存储区中分配一个对象。
* 因显式调用构造函数而创建的临时对象(详见本章后面的“临时对象”)。
* 因编译器隐含调用构造函数而创建的临时对象(详见本章后面的“临时对象”)。
* 其它类的数据成员。在创建类类型的对象时,若此类类型由其它类类型变量组成,将会引起该类中每个对象的创建。
* 一个类的基类子对象。创建派生类类型的对象时会引起基类构件的创建。
构造函数的作用
一个构造函数执行各种任务,但对于程序员来说,这些任务是不可见的,你甚至可以不必为构造函数写任何代码。
这些任务都同建立一个完全的、正确的类类型对象实例有关。
在MS C++中(同样也在很多其它C++中)一个构造函数:
* 初始化对象的虚拟基指针(vbptr)。如果该类是由虚拟基类派生出的,则这一步要执行。
* 按说明的顺序调用基类和成员的构造函数。
* 初始化对象的虚拟函数指针(vfptr)。如果该类有或者继承了虚拟函数,则这一步要执行,虚拟函数指针指向类的虚拟函数表(v-table),并且使虚拟函数的调用同代码正确绑定(binding)。
* 在构造函数体中执行可选的代码。
当构造函数结束以后,所分配的存储器就是一个给定类类型的对象。因为构造函数执行这些步骤,故虚拟函数的“迟后绑定”形态可以在虚拟函数的调用点得以解决,构造函数也要构造基类以及构造组合对象(作为数据成员的对象),迟后绑定是C++实现对象的多态行为的机制。收起