本帖最后由 superbe 于 2019-9-27 17:29 编辑
第一段代码比较简单,静态成员count是记录Zebra对象的数量的,main定义了两个Zebra对象,z1和z2,都会调用默认构造函数Zebra()执行count++,运行结果是2,也就是有2个Zebra对象。
第二段代码:
第1步:创建z1,执行默认构造函数Zebra()中count++,这时count=1。
第2步:调用函数f(z1),函数 f 会为形参创建一个临时Zebra对象,退出函数时再销毁这个对象。并且会调用复制构造函数初始化临时对象,而不调用默认构造函数Zebra()。由于Zerbra没有定义复制构造函数,编译器会生成一个“默认复制构造函数”,它的功能只是简单地将把z1成员的值赋给临时对象成员,而不会操作静态成员,所以count的值仍然是1,临时对象没有被计数。
第3步:退出f函数,销毁临时对象,这时执行析构函数使count--,count变成了0。
第4步:创建z2,执行默认构造函数Zebra()中count++,这时count=1。
综上,第二段代码运行结果是 1 1。
要想正确计数,可以自己添加一个复制构造函数,如下:
Zebra(Zebra &z){
age=z.age;
count++;
}
添加后运行结果是 2 2。也就是z1加上临时对象共2个对象,然后函数退出销毁一个再创建一个z2后,还是2个。
PS:执行构造函数和析构函数都有几种情况,最基本的是创建对象时调用构造函数,对象生命周期结束时销毁对象调用析构函数。