一、形式:Person(const Person &p);
二、时机:
- 用已存在的对象去初始化新的对象时
- 对象做函数形式参数时
- 对象做函数返回值时
三、默认的复制构造函数只是将传进来的对象的每个变量的值赋值给新的对象,有时会出现问题,比如:
成员变量中有一个指针类型时,默认的复制构造函数是把新指针指向原来的同一个地址中去了,此时如果析构旧的对象,那新的对象的指针就指针悬挂了,此时必须给出自己的复制构造函数定义,给指针开辟空间
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
class Person
{
private:
char *name;
int age;
public:
Person(char *Name,int a);
Person(const Person &p);//不用的话,会造成指针悬挂
~Person();
void setAge(int a){age = a;}
void show();
};
Person::Person(char *Name,int a)
{
name = new char[strlen(Name)+1];
strcpy(name,Name);
age = a;
cout<<"A person whose name is "<<name<<" and age is "<<age<<" is created."<<endl;
}
void Person::show()
{
cout<<name<<" the address is:";
printf("%d\n",name);
}
Person::~Person()
{
cout<<"A person whose name is "<<name<<" and age is "<<age<<" is erased"<<endl;
delete []name;
}
Person::Person(const Person&p)
{
name = new char[strlen(p.name)+1];
name = p.name;
age=p.age;
cout<<name<<" is copied."<<endl;
}
Person display(Person p)
{
return p;
}
int main()
{
Person p1("张三",20);
Person p2 = p1;//调用拷贝制造函数
//※拷贝函数调用时机:用已存在的对象初始化新对象
//Person p2("zs",10);//不会调用拷贝制造函数
//p2=p1;
p1.setAge(100);
p2.setAge(15);
p1.show();
p2.show();
display(p1);
//会被拷贝两次,
//※拷贝函数调用时机:对象做形式参数(可以改成传引用,这样不触发拷贝构造,节省空间);对象做函数返回值
return 0;
}