我之前认为的原因是,类在定义对象的时候,编译器会自动加上调用该类构造函数的语句,因为这个对象定义在全局范围内,没办法在全局范围内加 调用构造函数的语句,所以要将调用构造函数的语句放在其他地方,这就是为什么全局变量要在进入main()之前初始化好的原因。
但是后来想了下,发现好像有点不妥,如果编译器把调用这个构造函数的语句加在 main()函数最开头的位置,可不可以呢?
16 个解决方案
#1
可以
#2
你定义全局对象的时候它就构造了。
#3
这个你可以写一个简单的例子程序啊:
#include <iostream>
using namespace std;
class AA
{
public:
AA()
{
cout<<"This is AA"<<endl;
}
};
AA a;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"This is main"<<endl;
return 0;
}
输出结果:
This is AA
This is main
#include <iostream>
using namespace std;
class AA
{
public:
AA()
{
cout<<"This is AA"<<endl;
}
};
AA a;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"This is main"<<endl;
return 0;
}
输出结果:
This is AA
This is main
#4
可以
#5
呃。。但是这个看不出来是在startup()函数里面调用的还是main()函数调用的啊~~
虽然已经知道是在startup()函数调用的,但是我想试试在main()里面调用构造函数可以不可以。
但是C++编译器的动作我改不了。。也就写不出试验的代码~
#6
呃。楼上两位说可以的朋友,再弱弱的问一下。
那在startup里面调用构造函数有没有什么深层次的意义?。。。
那在startup里面调用构造函数有没有什么深层次的意义?。。。
#7
没有什么具体的意义,对象在构造的时候就会调用构造函数,不是都在main里面构造的!
#8
不可以,
#9
main里就不是全局变量了
#10
LZ,我最近正好在学这方面的内容,你说的问题我也学习到了。请看这篇:http://blog.csdn.net/chain2012/archive/2010/03/15/5382956.aspx
#11
呃。。不知道两位说可以的兄弟有没有看清我的内容啊。。感觉不踏实啊。。还是我问题没问清?。。好像很多朋友都理解错我的问题了 囧
#12
呃。。我确实是在看这部分的时候才有这个疑问的。。但是这个里面好像没有解释我的疑问呃。- -'''
我是想弄清楚为什么一定得在程序执行之前就要完成全局变量的初始化~为什么不在进入main()函数之后再执行全局变量的初始化
#13
C++规定,全局对象的构建比程序进入点(也就是WinMain)更早~~
所以,我那个例子里面的theApp的构造函数将更早于main。
执行结果中的那些构造函数的输入操作其实全都是在main函数之前完成的。
不知道,你是否能理解了~~·?
#14
呃。。我感觉我像是在钻牛角尖了。
我知道全局对象是在进入main()函数之前就初始化好了,我是想问为什么一定要在进入main()函数之前初始化这些全局变量。如果编译器把 调用全局变量构造函数的语句 放在main()函数中,所有用户代码的前面,也应该没什么问题啊~
#15
+1,正解。
#16
如果硬要 "把 调用全局变量构造函数的语句 放在main()函数中"
那编译一个有 定义全局对象 且 没有main()函数 的cpp文件的时候 编译器怎么办?
#1
可以
#2
你定义全局对象的时候它就构造了。
#3
这个你可以写一个简单的例子程序啊:
#include <iostream>
using namespace std;
class AA
{
public:
AA()
{
cout<<"This is AA"<<endl;
}
};
AA a;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"This is main"<<endl;
return 0;
}
输出结果:
This is AA
This is main
#include <iostream>
using namespace std;
class AA
{
public:
AA()
{
cout<<"This is AA"<<endl;
}
};
AA a;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"This is main"<<endl;
return 0;
}
输出结果:
This is AA
This is main
#4
可以
#5
呃。。但是这个看不出来是在startup()函数里面调用的还是main()函数调用的啊~~
虽然已经知道是在startup()函数调用的,但是我想试试在main()里面调用构造函数可以不可以。
但是C++编译器的动作我改不了。。也就写不出试验的代码~
#6
呃。楼上两位说可以的朋友,再弱弱的问一下。
那在startup里面调用构造函数有没有什么深层次的意义?。。。
那在startup里面调用构造函数有没有什么深层次的意义?。。。
#7
没有什么具体的意义,对象在构造的时候就会调用构造函数,不是都在main里面构造的!
#8
不可以,
#9
main里就不是全局变量了
#10
LZ,我最近正好在学这方面的内容,你说的问题我也学习到了。请看这篇:http://blog.csdn.net/chain2012/archive/2010/03/15/5382956.aspx
#11
呃。。不知道两位说可以的兄弟有没有看清我的内容啊。。感觉不踏实啊。。还是我问题没问清?。。好像很多朋友都理解错我的问题了 囧
#12
呃。。我确实是在看这部分的时候才有这个疑问的。。但是这个里面好像没有解释我的疑问呃。- -'''
我是想弄清楚为什么一定得在程序执行之前就要完成全局变量的初始化~为什么不在进入main()函数之后再执行全局变量的初始化
#13
C++规定,全局对象的构建比程序进入点(也就是WinMain)更早~~
所以,我那个例子里面的theApp的构造函数将更早于main。
执行结果中的那些构造函数的输入操作其实全都是在main函数之前完成的。
不知道,你是否能理解了~~·?
#14
呃。。我感觉我像是在钻牛角尖了。
我知道全局对象是在进入main()函数之前就初始化好了,我是想问为什么一定要在进入main()函数之前初始化这些全局变量。如果编译器把 调用全局变量构造函数的语句 放在main()函数中,所有用户代码的前面,也应该没什么问题啊~
#15
+1,正解。
#16
如果硬要 "把 调用全局变量构造函数的语句 放在main()函数中"
那编译一个有 定义全局对象 且 没有main()函数 的cpp文件的时候 编译器怎么办?