最后析构的是animal a(1,20);
倒数第二析构的是cat b(2,a);的成员 animal n;
构造 cat b(2,a);中 在 构造显示出来析构的是临时变量,在堆栈中构造。
因为 调用cat b(2,a);时发现 构造函数cat(int x,animal y):m(x),n(y),里,参数以传值方式调用,于是,调用拷贝构造函数在堆栈中构造参数 y,并在 n(y)这个构造代码中再一次调用拷贝构造函数,构造n 产生了两次拷贝,参数 y在n 构造完成后立刻销毁,于是析构参数 y的 animal析构函数调用产生了,就是 “构造cat” 这句后面的“析构animal”
把代码改成如下看看:
#include
using namespace std;
class animal
{
private:
int x,int y;
public:
animal():x(0),y(0)
{
cout<<"默认构造animal"<
animal(int new_x,int new_y):x(new_x),y(new_y)
{
//this->x=x;
//this->y=y;
cout<<"带参数构造animal"<
//animal(animal &a)
//注意:对象参数 以常量引用方式传递,否则难以传入常量对象。
animal(const animal &a):x(a.x),y(a.y)
{
//this->x=a.x;
//this->y=a.y;
cout<<"拷贝"<
~animal()
{
cout<<"析构animal"<
};
class cat
{
private:
int m;
animal n;
public:
cat():m(0)
{
}
//这里改成这样,不会再构造临时变量了。第一次的构造,析构都不会出现了。
//最后一定会显示两次析构
//因为 animal a(1,20);最先构造最后析构
//然后 cat b(2,a); 构造,析构
//构造时,会构造他的 animal n;
//析构b时,会析构b.n 这是倒数第二次的析构
//cat(int x,animal y):m(x),n(y)
//这里有问题,对象参数,以值方式传递,会引起不必要的拷贝构造函数调用。
//注意:对象参数 以常量引用方式传递
//否则引用方式传递,难以传入常量对象;
// 值方式传递,会引起不必要的拷贝构造函数调用。
cat(int x,const animal &y):m(x),n(y)
{
cout<<"构造cat"<
~cat()
{
cout<<"析构cat"<
};
void main()
{
animal a(1,20);
cat b(2,a);
}