现在的位置: 首页 > 综合 > 正文

在main()之前执行

2013年10月07日 ⁄ 综合 ⁄ 共 735字 ⁄ 字号 评论关闭

对于c++来说规定:全局类型的数据会在进入主函数(main())之前就已经被分配地址和赋值了。并且一个全局变量会在main之前调用其构造函数(对于int等基本类型也可以看成是由构造函数的),然后再main之后再调用析构函数。正如下面的例子:
#include <iostream>
using namespace std;

class stud
{
public:
  stud(int a)
  {num=a;
  cout<<"全局变量会在main()之前构造"<<endl; 
  }
  ~stud()
  {
  cout<<"全局变量也会在main()之后自动调用析构函数"<<endl;
  }
private:
  int num;
  static stud self;
};

stud stud1(10);

int main()
{
  cout<<"这是main()"<<endl;
  return 0;
}

输出结果:
D:/>test.exe
全局变量会在main()之前构造
这是main()
全局变量也会在main()之后自动调用析构函数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
另外值得一提的是类stud的成员:static stud self;
要注意:如果改成stud self;的话会编译错误,因为你不知不觉得来了个“递归定义”,并且这个递归却没有一个出口,所以会出错。
加上一个static就不一样了,我认为应该是静态变量是属于整个类的,而编译器对此的实现是采用的指针,来指向该类的在内存中静态区域,而指针可是一个已知的类型(x86里面占4B),所以不会出现错误;由此可知也可以改成stud *self;不会出错。
对于这些比较另类的c++知识推荐看一下《c++必知必会》,挺有收获的。

抱歉!评论已关闭.