复制构造函数

浅复制:

关于浅复制:

●在用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。

●默认复制构造函数所进行的是简单数据复制,即浅复制

#include <iostream>
#include <cstring>
using namespace std;
class Person 
{
public: 
	Person(char* name1,int a,double s);    
	void display(){cout<<name<<“\t”<<age<<“\t”<<salary<<endl;}
	~Person(){delete name;}		              //析构函数的声明
private:  
	char* name;
	int age;
	double salary;
};
Person::Person(char* name1,int a,double s)           
{
	name=new char[strlen(name1)+1]; 
	strcpy(name,name1);
	age=a;
	salary=s;
}
main()
{
 Person P1("WangWei ",8,3880); //调用构造函数创建对象P1
 P1.display();
 Person P2(P1);  //调用复制构造函数,用P1的数据初始化对象P2
 P2.display();
}

浅复制存在的问题:

 当程序运行结束时,p2对象调用析构函数,p1对象调用析构函数时,name所指向的空间已经不存在,此时发生错误。

深复制:

当类的数据成员含有指针类型时,浅复制构造函数存在问题。此时需要定义深复制构造函数。

关于深复制:

●通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。

缺省的复制构造函数是浅复制构造函数
深复制构造函数必须显式定义
当成员变量中含有指针变量时,需要定义深复制构造函数
深复制构造函数的特点
定义:类名 :: 类名 ( [ const ] 类名 & 对象名) ;
成员变量的处理:对指针类型的成员变量,使用 new 操作符进行空间的申请,然后进行相关的复制操作
Person::Person(const Person& P0) //复制构造函数的实现
{
   	 name=new char[strlen(P0.name)+1];
	strcpy(name,P0.name);
	age=P0.age;
	salary=P0.salary;
}

综上所述,我对深复制浅复制的认识即为:

当形参中有指针时,使用深复制。因为如果使用浅复制会使生成一个对象后,当它调用析构函数时,会回收指针指向的空间,造成下一个对象指针指向的空间为空。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归‘去’来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值