来源:远方网络 | 2006-1-6 | (有1925人读过)
这一小节的内容是说对象构造的顺序的,对象构造的顺序直接关系程序的运行结果,有时候我们写的程序不错,但运行出来的结果却超乎我们的想象,了解c++对对象的构造顺序有助于解决这些问题。
c++规定,所有的全局对象和全局变量一样都在主函数main()之前被构造,函数体内的静态对象则只构造一次,也就是说只在首次进入这个函数的时候进行构造!
代码如下:
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> #include <string> using namespace std;
class Test { public: Test(int a) { kk=a; cout<<"构造参数a:"<<a<<endl; } public: int kk; };
void fun_t(int n) { static Test a(n); //static Test a=n;//这么写也是对的 cout<<"函数传入参数n:"<<n<<endl; cout<<"对象a的属性kk的值:"<<a.kk<<endl; } Test m(100); void main() { fun_t(20); fun_t(30); cin.get(); }
下面我们来看一下,类成员的构造顺序的问题。
先看下面的代码:
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> using namespace std;
class Test { public: Test(int j):pb(j),pa(pb+5) {
} public: int pa; int pb; }; void main() { Test a(10); cout<<a.pa<<endl; cout<<a.pb<<endl; cin.get(); }
上面的程序在代码上是没有任何问题的,但运行结果可能并不如人意。
pa并没有得到我们所希望的15而是一个随机的任意地址的值。
这又是为什么呢?
类成员的构造是按照在类中定义的顺序进行的,而不是按照构造函数说明后的冒号顺序进行构造的,这一点需要记住!!!!!
|