B temp;
上的代码创建了一个B,相应的有一个析构调用。
temp.play(5);
这里传递参数时,由于play接受一个B对象,所以会创建一个B。
B play(B b){return b;}
由于play函数返回一个B,所以相应的会创建一个b的拷贝。
1)B temp;一次
2) B(5):两次,调用带参构造函数
3)return b;三次,调用拷贝构造函数。由于没有显示的定义拷贝构造函数,将调用默认拷贝构造函数。
由于Play函数的参数不是指针也不是引用,所以会调用一次拷贝构造函数创建一个新的对象,之后当然会再调用一次析构函数了,你把类定义里添加拷贝构造函数就能看出来了
一个temp对象和两个临时对象(一个是成员函数play的参数,另一个是成员函数play的返回值),所以最终要调用三次析构函数。