下面代码用p1去初始化p2,会将p1传入到Person(const Person &p),拷贝构造函数的形参相当于const Person &p=p1;
#include <iostream>
using namespace std;
class Person{
public:
Person(){
cout<<"无参构造函数"<<endl;
}
Person(const Person &p)//相当于const Person &p=p1;
{
cout<<"拷贝构造函数"<<endl;
}
~Person(){
cout<<"析构函数"<<endl;
}
};
int main()
{
Person p1;
Person p2=p1;
return 0;
}
结果:
下面修改拷贝构造函数形参传的是值,此时拷贝构造函数的形参相当于const Person p=p1;
仔细一看p=p1,又会调到拷贝构造函数,再将p1赋值给拷贝构造函数的形参p,即p=p1,仔细一看又是p=p1,再次调到拷贝构造函数,再将p1赋值给拷贝构造函数的形参p,即p=p1,这样就会形成无休止的递归调用从而导致栈溢出
所以C++不允许拷贝构造函数形参为值传递
#include <iostream>
using namespace std;
class Person{
public:
Person(){
cout<<"无参构造函数"<<endl;
}
Person(const Person p)//相当于const Person p=p1,p=p1又会调用拷贝构造函数,无休止
{
cout<<"拷贝构造函数"<<endl;
}
~Person(){
cout<<"析构函数"<<endl;
}
};
int main()
{
Person p1;
Person p2=p1;
return 0;
}
结果:
参考: