c++ 拷贝构造函数_C++拷贝构造和拷贝赋值

3d8a9380b3275c767a0affcaac2286a8.png

1 浅拷贝和深拷贝

1)如果一个类包含指针形式的成员变量,缺省拷贝构造函数只是复制了指针成员变量的本身,而没有复制指针所指向的内容,这种拷贝称为浅拷贝。

class STRING
{
public:
STRING( const char* s = "" ) :_str( new char[strlen(s)+1] )
{
strncpy( _str, s, strlen(s)+1 );
}
~STRING()
{
cout << "~STRING" << endl;
if (_str)
{
delete[] _str;
_str = NULL;
}
}
void show()
{
printf ("_str = %s", _str);
}
private:
char* _str;
};

33829995c189bb35874335cde8818b5a.png

想要学习更多C/C++编程知识,可以加入C/C++学习交流群:1121175506和大家一起交流学习。

2)浅拷贝将导致不同对象间的数据共享,同时会在析构函数中引发 "double free" 异常。因此必须提供一个支持复制内容的深拷贝构造函数。

浅拷贝原理:

int* p1 = new int(100);
int* p2 = p1;
delete p1;
delete p2; //erroe, double free

深拷贝原理:

int* p1 = new int(100);
int* p2 = new int(*p1);
delete p1;
delete p2; //ok

浅拷贝构造函数

STRING( const STRING& s )
{
_str = s._str;
}

深拷贝构造函数

STRING( const STRING& s )
{
_str = new char[strlen(s._str) + 1];
strncpy( _str, s._str, strlen(s._str) + 1 );
}

b20fde567453de383096fac1f7f3d5f9.png

想要学习更多C/C++编程知识,可以加入C/C++学习交流群:1121175506和大家一起交流学习。

2 深拷贝赋值和浅拷贝赋值

拷贝赋值函数即对赋值运算符的重载。

类的缺省拷贝赋值和缺省的拷贝构造一样,是浅拷贝,为了得到深拷贝效果,防止现"double free"异常,就需要自己定义一个支持深拷贝的拷贝赋值函数,其步骤如下:

类名& operator = (const 类名& that) {

1)防止自赋值

3)释放旧资源

2)分配新资源

4)赋值新内容

5)返回自引用

*6)复用深拷贝构造和析构

}

浅拷贝赋值函数:

STRING& operator = (const STRING& s)
{
if (this != &s)
{
this->_str = s._str;
}
return *this;
}

深拷贝赋值函数:

STRING& operator = (const STRING& s)
{
if (this != &s)
{
delete[] _str;
this->_str = new char[strlen(s._str) + 1];
strncpy(this->_str, s._str, strlen(s._str) + 1);
}
return *this;
}

想要学习更多C/C++编程知识,可以加入C/C++学习交流群:1121175506和大家一起交流学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值