引用和传值 有关问题,为啥传值多出来delete
引用和传值 问题,为啥传值多出来delete
// Person 类
class CPersion
{
public:
CPersion(void);
~CPersion(void);
};
CPersion::CPersion(void)
{
cout<<"creat a person"<<endl;
}
CPersion::~CPersion(void)
{
cout<<"delete a person"<<endl;
}
// Student 类
class CStudent : public CPersion
{
public:
CStudent(void);
~CStudent(void);
};
CStudent::CStudent(void)
{
cout<<"creat a student"<<endl;
}
CStudent::~CStudent(void)
{
cout<<"delete a student"<<endl;
}
// main func
bool IsAStudent(CStudent s)
{
return false;
}
void main()
{
CStudent s = CStudent();
IsAStudent(s);
}
使用VS2010,为什么上面输出的是
creat a person
creat a student
delete a student
delete a person
delete a student
delete a person
而如果传的是引用
bool IsAStudent(CStudent& s)
{
return false;
}
输出的是
creat a person
creat a student
delete a student
delete a person
问题是为什么多出来
delete a student
delete a person
谁能帮解释一下???
------解决方案--------------------
1、首先你本来就是要调用派生类的构造函数,其次基类的构造函数要优先于派生类的构造函数,所以当你调用拷贝函数时,会出现基类的构造函数。还有,你写的拷贝函数并没有要求拷贝基类,所以只是简单的拷贝派生类本身的信息,因此调用的是基类的普通构造函数,而不是基类的复制构造函数。
2、当你不定义派生类的拷贝函数时,调用的是系统默认的拷贝函数,这时系统会调用基类的拷贝构造函数,所以你看到它没有调用基类的构造函数。你可以把派生类的拷贝构造函数去掉,只留下基类的拷贝构造函数,打印结果就会是这样:
creat a person
creat a student
copy a person
delete a student
delete a person
delete a student
delete a person
所以关键还是你自己写的拷贝函数有问题,编译器不会主动帮你拷贝父类。如果你自定义的拷贝构造函数没有要求拷贝父类,编译器是不会越俎代庖的..
// Person 类
class CPersion
{
public:
CPersion(void);
~CPersion(void);
};
CPersion::CPersion(void)
{
cout<<"creat a person"<<endl;
}
CPersion::~CPersion(void)
{
cout<<"delete a person"<<endl;
}
// Student 类
class CStudent : public CPersion
{
public:
CStudent(void);
~CStudent(void);
};
CStudent::CStudent(void)
{
cout<<"creat a student"<<endl;
}
CStudent::~CStudent(void)
{
cout<<"delete a student"<<endl;
}
// main func
bool IsAStudent(CStudent s)
{
return false;
}
void main()
{
CStudent s = CStudent();
IsAStudent(s);
}
使用VS2010,为什么上面输出的是
creat a person
creat a student
delete a student
delete a person
delete a student
delete a person
而如果传的是引用
bool IsAStudent(CStudent& s)
{
return false;
}
输出的是
creat a person
creat a student
delete a student
delete a person
问题是为什么多出来
delete a student
delete a person
谁能帮解释一下???
------解决方案--------------------
1、首先你本来就是要调用派生类的构造函数,其次基类的构造函数要优先于派生类的构造函数,所以当你调用拷贝函数时,会出现基类的构造函数。还有,你写的拷贝函数并没有要求拷贝基类,所以只是简单的拷贝派生类本身的信息,因此调用的是基类的普通构造函数,而不是基类的复制构造函数。
2、当你不定义派生类的拷贝函数时,调用的是系统默认的拷贝函数,这时系统会调用基类的拷贝构造函数,所以你看到它没有调用基类的构造函数。你可以把派生类的拷贝构造函数去掉,只留下基类的拷贝构造函数,打印结果就会是这样:
creat a person
creat a student
copy a person
delete a student
delete a person
delete a student
delete a person
所以关键还是你自己写的拷贝函数有问题,编译器不会主动帮你拷贝父类。如果你自定义的拷贝构造函数没有要求拷贝父类,编译器是不会越俎代庖的..