朱金灿
前言:最近回答了网友一个问题,当然我不是C++高手,我仅是提出我的猜想和大家交流。
经典的C++的教科书都这样写着:全局对象在调用 main之前初始化, 在退出main之后析构。但是大家请看下面这样一个程序:
#include <cstdlib>
#include <iostream>
#include <conio.h>
class gb
{
public:
gb::gb()
{
std::cout<<"start"<<std::endl;
};
gb::~gb()
{
std::cout<<"end"<<std::endl;
getch();
};
};
gb a;
int main()
{
std::cout<<"This is in main"<<std::endl;
return 0;
}
大家认为输出是什么呢?大家可能会说:这不是很简单吗?
Start
This is in main
End
实际上事情并没有这么简单。在dev-c++-4.9.9.2的工程上,输出结果是顺理成章的:
Start
This is in main
End
在VC6.0上建一个控制台工程,把代码拷贝进去,发现运行结果却是:
Start
This is in main
当时很感疑惑,难道gb类对象a没有执行析构函数?思考了一会,决定试验一下。把代码稍为修改一下,把cout全部换为C语言的printf()函数,如下:
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <stdio.h>
class gb
{
public:
gb::gb()
{
//std::cout<<"start"<<std::endl;
printf("start\n");
};
gb::~gb()
{
// std::cout<<"end"<<std::endl;
printf("end\n");
getch();
};
};
gb a;
int main()
{
std::cout<<"This is in main"<<std::endl;
return 0;
}
运行结果是:
Start
This is in main
End
这说明析构函数是有执行的。下面提出我的一个猜想:cout作为一个iostream类的对象,在退出main函数后比gb类对象a先执行析构函数,故无法输出End。值得注意这种全局变量的析构顺序是和编译器相关的,在VC上是cout ——〉gb a,而在dev-c++-4.9.9.2是gb a——〉cout。实际上C++标准只规定了同一个cpp文件里的全局变量的构造和析构顺序,
不同文件间的顺序没有规定,因为 gb a是我的cpp里的全局变量 ,cout是iostream里的全局变量,就是说,因为标准中没有规定它们的析构顺序,各个编译器愿意怎么做就怎么做,都是符合标准的。
分享到:
相关推荐
VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量...
用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。
当时想到的就是使用全局变量,在 app.js 中定义好全局变量,点击组件页面时就修改全局变量的值,父页面同样使用全局变量的值,这样一来就可以动态打开/关闭弹出层且传递值了。 下面先看看 app.js 中怎么定义的: ...
在C++中,声明一个类,并且定义一个全局变量,练习全局变量的使用。注意全局变量的使用技巧和方法。
全局变量、局部变量、静态全局变量、静态局部变量的区别
注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。 什么时候初始化 根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊...
labview功能性全局变量的详细使用,避免局部变量的数据争抢
Android用Application设置全局变量以及使用 如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型;而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅...
Spring MVC配置Freemarker全局变量,实现应用全路径
VB 全局变量举例 VB 全局变量举例 VB 全局变量举例
静态全局变量,静态局部变量,全局变量,局部变量静态全局变量,静态局部变量,全局变量,局部变量
C语言面试题大汇总之华为面试题:1、局部变量能否和全局变量重名;2、如何引用一个已经定义过的全局变量;3、全局变量可不可以定义在可被多个.C文件包含的头文件中 为什么;4、语句for( ;1 ;)有什么问题 它是什么...
在A中定义有全局变量X(或类的静态成员变量),则在动态库B中访问的X,与可执行程序C中访问的X是同一个变量还是两个不同的变量? 答案:是两个不同的变量。 2. 工程中包含动态库A,动态库B,可执行程序C。C依赖于A和...
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。 对于全局变量和局部变量,即使变量名相同,但是因为定义在不同的作用...
变量可以分为全局变量、静态全局变量、静态局部变量和局部变量 按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分:全局变量在整个工程文件内都...
C# WinForm通过全局变量实现不同窗体之间传值的解决方案的源码
CC++中的静态全局变量,静态局部变量,全局变量,局部变量的区别
易语言源码易语言汇编设置全局变量源码.rar
在C语言中使用extern 关键字来定义全局变量的时候,我们需要在.h文件和.c文件中重复定义,这种重复,导致了出错几率的增加。 今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个cpp文件里面。于是,...
c语言中详细解说局部变量和全局变量的关系和作用,让你明白!