CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

关于全局函数及静态析构函数和静态析构函数的问题

楼主tans75(品味人生)2005-06-01 10:21:14 在 C/C++ / C++ 语言 提问

class   CDemo{  
  public:  
  CDemo(){m_nVal=0;}  
  CDemo(int   nVal){m_nVal=nVal;}  
  ~CDemo(){cout<<"Destructor:"<<m_nVal<<endl;}  
  private:  
  int   m_nVal;  
  };  
  CDemo   d0;  
  CDemo   d1(1);  
  void   main()  
  {  
  CDemo   d2(2);  
  static   CDemo   d3(3);  
  static   CDemo   d4(4);  
  CDemo   d5(5);  
   
  }  
   
  大侠们可否对编译结果给个解答。  
  问题点数:30、回复次数:5Top

1 楼mccxj(老鼠不逛街)回复于 2005-06-01 10:25:25 得分 0

忘记加了#include<iostream.h>了。。  
  Destructor:5  
  Destructor:2  
  Destructor:4  
  Destructor:3  
  Destructor:1  
  Destructor:0  
  Press   any   key   to   continue  
  这是结果。。先等等。。待会给你说。。Top

2 楼mccxj(老鼠不逛街)回复于 2005-06-01 10:33:03 得分 20

首先,构造函数的调用顺序和析构函数的调用顺序刚刚好相反。  
  CDemo   d0;  
  CDemo   d1(1);//这两个是全局的。。因此最先调用构造函数  
  void   main()  
  {  
  CDemo   d2(2);  
  static   CDemo   d3(3);  
  static   CDemo   d4(4);//静态成员在进入主函数main的时候就分配了内存。。因此也调用了。  
  CDemo   d5(5);//d2和d5不是全局的也不是静态的。。所以就最后了。。  
   
  }  
  因此构造函数调用的是0,1,3,4,2,5  
  析构函数就是5,2,4,3,1,0。。  
  Top

3 楼tans75(品味人生)回复于 2005-06-01 10:35:59 得分 0

#include<iostream>  
  using   namespace   std;  
   
  class   CDemo{  
  public:  
  CDemo(){m_nVal=0;}  
  CDemo(int   nVal){m_nVal=nVal;}  
   
   
   
  ~CDemo(){cout<<"Destructor:"<<m_nVal<<endl;}  
   
  private:  
  int   m_nVal;  
  };  
  CDemo   d0;  
  CDemo   d1(1);  
   
  void   main()  
  {  
   
  CDemo   d2(2);  
  static   CDemo   d3(3);  
   
  static   CDemo   d4(4);  
  CDemo   d5(5);  
   
  }  
   
  如果是  
  #include<iostream>  
  using   namespace   std;  
  结果为什么是:  
  Destructor:5  
  Destructor:2  
  Destructor:Press   any   key   to   continue  
  而且  
  Press   any   key   to   continue应该是顶头呀。  
  不明白。  
   
   
  Top

4 楼whyglinux(山青水秀)回复于 2005-06-01 10:58:48 得分 10

通过楼主给出的这个程序,可以清楚地了解全局对象、静态局部对象和局部对象的生存期。如果再在构造函数中加上适当的输出信息,还可以更进一步了解对象在什么时候生成的。  
   
  d0、d1是全局对象,依次在main()函数执行之前被构建,相应地也最晚被释放。  
   
  其它对象按照它们在main()函数中出现的顺序构建。至于析构,由于d2、d5是局部对象,在   main()   函数结束之前按照构建的相反顺序进行析构。d3、d4是静态局部对象,从被创建之后在程序的运行期间将一直存在。由于d3、d4的创建时候晚于d0、d1,所以在   main()   函数结束后d4、d3先后被析构,最后才是d1、d0。Top

5 楼mccxj(老鼠不逛街)回复于 2005-06-01 11:04:09 得分 0

构造函数:全局对象(无论是不是静态,都是按顺序调用)=》静态局部对象=》局部对象Top

相关问题

  • 请教:全局函数和静态函数 有什么区别?
  • 请问全局函数和静态函数各有什么优缺点?
  • 全局函数
  • 关于全局构造函数?
  • java有静态构造函数吗?
  • 各位大虾:怎样在MFC中定义全局函数和静态数组
  • C++中静态成员函数存放在全局数据区还是代码区?
  • 在对话框静态成员函数或者全局函数里面怎么得到对话框内的控件对象?
  • 构造函数一定要是静态的么??
  • 关于静态构造函数,大家帮忙

关键词

  • 函数
  • cdemo
  • 静态
  • 析构
  • nval
  • 全局
  • destructor
  • 调用
  • 对象
  • 构造

得分解答快速导航

  • 帖主:tans75
  • mccxj
  • whyglinux

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo