在C++中,有四种方法产生一个对象。
第一种方法是在堆栈(stack)之中产生:
void MyFunc()
{
CFoo foo;//在堆栈(stack)中产生foo对象
}
第二种方法是在堆(heap)中产生它:
void MyFunc()
{
CFoo* pFoo=new CFoo();//在堆(heap)中产生对象
}
第三种方法是产生一个全局对象(同时也必然是个静态对象)
CFoo foo;//在任何函数范围外做此操作
第四种方法是产生一个局部静态对象
void CMyFunc()
{
static CFoo foo;//在函数范围之内的一个金泰对象
}
不论哪一种做法,C++都会产生一个针对CFoo构造函数的调用操作。
前两种情况,C++在配置内存之后,立刻产生一个隐藏的构造函数调用。
第三种情况,由于对象实现于任何"函数活动范围"之外,显然没有地方来安置这样一个构造函数调用操作。第三种情况的构造函数调用操作必须靠startup代码帮忙。startup是早于程序进入点(main或WinMain)执行起来的代码,由c++编译器提供,被链接到程序中。startup代码可能做些像函数库初始化、进程信息设立、I/O stream产生等操作,以及对static对象的初始化操作(也就是调用其构造函数)。当编译器编译你的程序,发现一个静态对象时,它会把这个对象加到一个链表中,并且还加上一个指针,指向对象的构造函数及其参数。把控制权交给程序进入点之前,starup代码会遍历链表,调用所有登记的构造函数和参数,这样就初始化了静态对象。
第四种情况(局部静态对象)只会有一个实例产生,而且在固定的内存上(既不是stack也是heap)。它的构造函数在控制权第一次转移到其声明处(也就是在MyFunc第一次被调用)时被调用。