C++面试 深浅拷贝问题

 

一、浅拷贝问题

(1)如果类class中叧包含简单数据成员,没有指向堆的指针, 可以使用编译器提供的默认复制构造函数,但是这种情况很少。很多时候我们都会在头文件定义很多需要指向堆的指针。

 如果发生浅拷贝等、默认复制构造函数等问题是极其危险的操作,会发生段错误,析构函数去两次释放同一个地址。

我的理解是浅拷贝是拷贝了对象的引用,因此地址不变。

int main()
{
	{// 花括号让s1和s2变成局部对象,方便测试
		String s1;
		String s2(s1);// 复制对象,s1临时对象作为s2的参数去复制。这样会让里面的指针指向同一个地址。
     //如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。
	}
}

复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用。

(2)要解决浅拷贝问题,C++中引入了深拷贝。
深拷贝:
给每个对象独立分配资源,保证多个对象之间不会因共享资源而造成多次释放造成程序崩溃问题。

String(const String& s)//拷贝构造  参数是自己
		:_str(new char[strlen(s._str) + 1]) //赋值列表开辟空间
	{
		strcpy(_str, s._str);  
	}
	String& operator=(const String& s)	//赋值运算符重载
	{
		if (this != &s)//防止自己给自己赋值
		{
			_str =  new char[strlen(s._str) + 1]; //得到新
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值