在启动的时候,有一些应用程序需要调用一些日常程序来定位main函数启动时必须用到的资源。一个很好的例子是日志工具,它会记录程序的活动情况。这个日志服务必须在main()之前启动,这样它就能够记录main()的启动。要确保上述情况的发生,就要从全局对象的构造函数里调用初始化程序。全局对象要在main()启动之前在概念上被构建好。例如:
class Init
{
public:
Init()
{
log_activity();
}
};
Init init; // global instance
int main()
{
activity_report* rep=read_log();
//..
}
等到main()启动,init就已经被构建好了。在其构建的过程中,它调用了log_activity()函数。因此,main()可以开始执行的时候就立即安全地从日志文件里读取数据。
这项技术也被广泛地用在了标准模板库(Standard Template Library)里。例如,iostream的对象cout和cin都在main()之前被构建。那么C++如何确保全局对象在main()之前被构建了呢?在大多数的实现方式里,核心会运行专门的启动代码,这样的代码会在启动main()之前完成所有的初始化工作。
本文作者Danny Kalev 是一个系统分析家、软件工程师,在C++和面向对象设计方面有着14年的专业经验。