全局对象和函数内静态对象调用构造析构函数差异

news/2024/7/8 2:47:19 标签: c++, 对象

全局对象和函数内静态对象调用构造析构函数差异

转自http://blog.csdn.net/mznewfacer/article/details/6897952

全局对象的构造函数将在main函数之前运行。析构在main函数之后运行。

函数内部的static对象的构造函数将在第一次调用该函数时调用,main函数结束之后执行。但其析构会在全局对象之前,因为所有对象的析构顺序和构造顺序相反,即全局对象在函数内部的static对象前构造,在后面析构。若包含静态局部对象的函数未被调用,则也不进行析构。

可以通过atexit函数指定当离开main或者调用exit时所要执行的动作。其在所有的析构函数之前运行。

 

class Obj

{

        char cT;

        public:

        Obj(char c)

        {

                cT=c;

                cout<<"Obj::Obj()  for "<<c<<endl;

        }

        ~Obj()

        { 

                cout<<"Obj::~Obj() for "<<cT<<endl;

        }

};

 

Obj A('A'); //全局对象在main之前构造

void f()

{

        static Obj B('B');

}

 

void main()

{

        cout<<"inside  main()"<<endl;

        f();

        cout<<"leaving main()"<<endl;

}

OUTPUT:

Obj::Obj()  for A

inside  main()

Obj::Obj()  for B

leaving main()

Obj::~Obj() for B //在A前析构

Obj::~Obj() for A

关于这个local static对象和non-local static对象的处理原则,可以参见effective c++的条款四,但是里面没有讲到关于这两者析构的顺序,而上述这篇文章有补充。


http://www.niftyadmin.cn/n/739348.html

相关文章

如何设置vs2005的环境变量

http://blog.163.com/ctct7833126/blog/static/1616246902012785567313/ 这篇文章主要写给那些以前没有用过VS2005的新手&#xff0c;同时也是自己学习经验的积累&#xff0c;高手就不用看了以免浪费您宝贵的时间。 在VS的工程中常常要设置头文件的包含路径&#xff0c;当然你可…

ubuntu14.04使用--字体

很多时候比如Flash插件或者其他界面中会出现小方格的空&#xff0c;表示无法显示字符&#xff0c;特别是在非英文字符&#xff0c;例如中&#xff0c;日&#xff0c;韩的字符。1、下载解压字体首先需要下载相应语种的字体。网上有很多的字体包&#xff0c;例如win7和winxp都有完…

ubuntu14.04-flash插件安装

我用的浏览器是chromiun浏览器&#xff0c;感觉这个浏览器比火狐浏览器好用的多。第一步、下载Adobe Flash Player并解压 tar xvfinstall_flash_player_11_linux.i386.tar.gz . 第二步、输入以下指令&#xff1a;sudo cp libflashplayer.so/usr/lib/chromium-browser/plugins/…

Ubuntu14.04--系统中解压rar和zip文件的方法

在Ubuntu系统中解压rar和zip文件的方法 大家在以前的windows系统中会存有很多rar和zip格式的压缩文件&#xff0c;Ubuntu系统默认情况下对这些文件的支持不是很好&#xff0c;如果直接用"归档管理器"打开会提示错误&#xff0c;因此今天跟大家分享一下如何在Ubuntu中…

Linux在C语言下的时区设置与修改(一)

清理当前使用底层OS适配库代码&#xff0c;代码中涉及到了utc时间和本地时间转换。 发现代码中时区设置有问题。 每次设置时区时都会调用tzset函数&#xff0c;然后直接使用被初始化后的全局变量timezone去和utc时间相加减得到本地时间。 但是问题来了&#xff0c;这样做真的…

Linux在C语言下的时区设置与修改(二)

前面说到是去同步时区的接口&#xff0c; 从同步的角度来讲&#xff0c;如何获取被设置后的时区&#xff0c;还有一个接口即gettimeofday&#xff0c; 这个接口不仅可以获取时区&#xff0c;posix标准似乎还很好心的在第二个参数中放置了可以用来获取时区和夏冬令时的tz参数&…

Git用户手册

转自&#xff1a;http://blog.csdn.net/zzulp/article/details/6238527 GitUserManualChinese - Robin Wiki GitUserManualChinese Git 用户手册&#xff08;1.5.3 及后续版本适用&#xff09; 翻译: 罗峥嵘 (Robin Steven) < vortunegmail.com > 英文版本: http…

Linux在C语言下的时区设置与修改(三)

前面一直在讲tzset似乎只在初始化的时候才生效,当tzset调用多次时没用。今天稍微深入的查找了glibc中的tzset的实现&#xff0c;发现其实不是这么回事&#xff0c;其真正的实现是每次都会去解析的。为什么之前会误认为tzset无效&#xff0c;是由于本地进程的环境变量和全局环境…