zoukankan      html  css  js  c++  java
  • C++四种不同的对象生存方式

    在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第一次被调用)时被调用。

  • 相关阅读:
    11g SPA (sql Performance Analyze) 进行升级测试
    SPA游标采集之去除重复
    C++ 实现分数的四则运算
    计算两个数的最大公约数和最小公倍数(欧几里得算法)
    计算a月的第b个星期c
    完数问题
    求整数的最大质因子
    C++ 读取文本文件内容到结构体数组中并排序
    月饼问题PAT B1020(贪心算法)
    路径打印(set以及字符串的相关操作)
  • 原文地址:https://www.cnblogs.com/mazg/p/4704131.html
Copyright © 2011-2022 走看看