复制构造函数和深度复制

36 篇文章 1 订阅

浅复制和深度复制

  1. 浅复制:仅复制指针值,新的指针和原来的指针指向同一地址,执行析构函数会释放同一内存单元两次,造成悬挂指针
  2. 深度复制:通过将副本地址赋给新成员,复制指向的数据。

复制构造函数

如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而仅仅是指针。
复制构造函数用于将一个对象复制到新创建的对象中,因此,它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中。
原型:Class_name(const Class_name &);

class String
{
private:
	char *str;
	int len;
	...
public:
	...
	String(const String &);	//	复制构造函数
};
...
String::String(const String &st)	//复制构造函数定义
{
	len=st.len;
	str=new char [len+1];	//用new分配内存
	strcpy(str,st.str);
}

何时使用复制构造函数

  1. 将新对象初始化为一个同类对象
  2. 按值将对象传递给函数
  3. 函数按值返回对象
  4. 编译器生成临时对象

复制赋值运算符

String & String::operator=(const String &st)
{
	if(this == &st)
		return *this;
	len=st.len;
	delete[] str;	//先delete原来的内存
	str=new char [len+1];	//再用new重新分配内存
	strcpy(str,st.str);
	return *this;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值