读程序:
1#include<iostream>
2using namespace std;
3int cn=0;
4
5class myCla
6{
7 char cc;
8 public:
9 myCla(char ch)
10 {
11 ++cn;
12 cc=ch;
13 cout<<"constructor:cn="<<cn<<",ch="<<ch<<endl;
14 }
15 ~myCla()
16 {
17 --cn;
18 cout<<"destructor:cn="<<cn<<",cc="<<getcc()<<endl;
19 }
20 char getcc()
21 {
22 return cc;
23 }
24};
25myCla globalG('G');
26int main()
27{
28 myCla autoA('A');
29 for(int i=0;i<2;++i)
30 {
31 cout<<"---begin block"<<endl;
32 myCla autoB('B');
33 static myCla static5('S');
34 cout<<"---end block"<<endl;
35 }
36 cout<<"---end main"<<endl;
37 return 0;
38}
39
运行结果为:
constructor:cn=1,ch=G
constructor:cn=2,ch=A
---begin block
constructor:cn=3,ch=B
constructor:cn=4,ch=S
---end block
destructor:cn=3,cc=B
---begin block
constructor:cn=4,ch=B
---end block
destructor:cn=3,cc=B
---end main
destructor:cn=2,ch=A
destructor:cn=1,ch=S
destructor:cn=0,ch=G
结果分析:
(1)类的构造函数与析构函数都是特殊的类成员函数。构造函数主要完成对象的初始化工作,而析构函数主要完成对象
撤销前的善后工作。形象地说,当对象诞生和死亡时,将分别调用该对象所属类的构造函数和析构函数。
(2)与"小级别类型变量"的作用域及生存期类似,对象(即"大级别"的类类型的变量)也有各自的作用域及它们的生存期。
如全局性对象(程序中的globalG)将在执行main前被构造,各函数内的局部对象(auto属性),将在说明时被构造。块级别的局部对象
(auto属性者,程序中的autoB),在每次入块后都被重新构造(重新分配空间并初始化),出块时结束生命期(调用析构函数去析构它们)。
块级别的局部对象(static属性者,程序中的staticS),其作用域局部于块,但其生命期与全局性对象相同,只在第一次遇见时分配空间并初始化。