对象可以是根据设计需要放在不同的位置,那么它们的构造都是按照书写的顺序依次执行的吗?它们的构造函数执行有什么规则呢?
在构造对象时,由于对象所处的位置不同而导致构造函数的执行时机也不同,C++给构造对象顺序做出了规定。
1.局部对象
局部的对象是指在块作用域和文件作用域内的对象,它们的构造顺序和声明顺序一致。如在例2.8中,如果把main函数改为如下代码。
则程序的运行结果如下。
构造了图书对象:电子科技大学出版社计算机类C++程序设计
在main 函数中!
构造了图书对象:电子科技大学出版社计算机类C语言程序设计
构造函数的执行按代码的编写先后顺序依次进行,首先创建了book 对象,然后创建book2对象。
2.局部静态对象
局部静态对象是指定义在函数块内,用static声明的对象。只在第一次在程序执行到声明该对象的语句时创建一次(与静态局部变量只初始化一次类似),创建后就存在于程序的整个生命周期,当多次调用此程序块时也不再执行它的构造函数了。
【例2.9】使用静态对象,观察静态对象的构造函数的执行次数。
在此程序中,可以看出静态对象的构造函数只在第一次执行,也就说静态对象只构造一次。对于静态对象的数据成员如果没有赋初始值,则其数据成员和普通的静态变量一样初始化为0。(www.daowen.com)
3.全局对象
所有的全局对象都在main函数之前被构造,而且构造时,如果在同一文件中,则按书写顺序构造,如果在不同的文件中,则构造无特殊顺序。因为在这些不同的文件在编译连接时,编译器不能控制文件的连接顺序,所以也不能决定不同文件中的全局对象的构造顺序。为了避免在不同的机器上程序执行的结果不一致,在使用全局对象时不要互相访问不同文件中的全局对象。
【例2.10】使用全局对象,查看全局对象的构造顺序。
由此可见全局对象在main函数执行前先构造,便于main函数及其他函数的使用。
4.动态对象
动态对象是指使用new 操作符在堆中创建的对象,在程序执行到该语句是被动态创建,同时要求在不使用对象时,使用delete操作符释放对象。
【例2.11】动态创建对象,观察构造函数的执行。
在使用new 操作符创建堆对象时,对象的数据成员的空间在堆中,在不使用对象时,一定要使用delete操作符释放堆对象。
5.复合对象
复合对象是指对象的数据成员也是对象类型的对象。在构造复合对象时,首先构造成员对象,然后构造当前对象。也就说,先有部分,再组合成整体。
【例2.12】定义一个桌子对象,桌子由桌面和桌腿构成,桌面和桌腿分别是两个类类型。
在例2.12中,系统先构造了对象成员,然后构造复合对象。当复合对象有多个对象成员时,对象成员的构造顺序是按照书写顺序先后构造。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。