关于拷贝构造

概念
拷贝构造函数的含义:
以一个对象为蓝本,来构造另一个对象(使用一个已经存在的对象,去构造/初始化另一个对象)
如:Object b;
Object a(b);//隐式调用拷贝构造;或者Object a=b;//显示调用拷贝构造
称作:以b为蓝本,创建一个新的对象a(a是b的一个拷贝/备份,两者的内容完全相同)
格式
类名(类名 const& 参数名)
{
函数体
}
这里的const----防止函数内部修改值
&---------防止无限循环拷
注意:拷贝构造函数应该是隐式调用的,因此不加explicit
分类
1.浅拷贝(默认的拷贝构造):
成员变量无动态内存(指针)变量等,在拷贝构造函数内对成员变量只做简单的赋值,不做内存申请
2,深拷贝:成员变量有动态内存(指针等)变量时,在拷贝构造函数内对成员变量先进行内存申请,然后进行内存拷贝
:如果没有主动给出拷贝构造,编译器会自动添加一个拷贝构造(浅拷贝),主动给出后默认的拷贝构造消失
如果类中有动态内存变量出现,必须重写拷贝构造,且使用深拷贝
浅拷贝:
//此类情况使用浅拷贝
class Cperson
{
private:
int a;
public:
Cperson(Cperson const& other);//拷贝构造
}
Cperson::Cperson(Cperson const& other)
{
this->a=other.a;
}
深拷贝:
//此类含有指针的情况使用深拷贝
class Cperson
{
private:
int age;
char* name;
public:
Cperson(Cperson const& other);
}
Cperson::Cperson(Cperson const& other)
{
this->age=other->age;
if (other.name)//深拷贝
{
int len = strlen(other.name);
this->name = new char[len+1];
strcpy(this->name, other.name);
}
else
this->name = NULL;
}
int main()
{
Cperson person1;
Cperson person2(person1);//隐式调用拷贝构造
Cperson person2=person1;//显示调用拷贝构造
}

直接初始化和拷贝初始化(拷贝构造函数、移动构造函数)

浅拷贝错误演示
原因:下列代码中,other->name指向一块内存,直接把other->name赋值给this->name,则两个变量都指向同一块内存,虽然不会出错,但是对不同的指针操作,会改变另一个指针的内容,非常的危险,建议使用上面的深拷贝
class Cperson
{
private:
int age;
char* name;
public:
Cperson(Cperson const& other);
}
Cperson::Cperson(Cperson const& other)
{
this->age=other.age;
this->name=other.name;//错误做法
}
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值