C++赋值运算符重载

不少知识点

在一个类里面没有定义(重载)“=”(赋值运算符)时,那么编译器会生成一个默认的赋值函数。它实现对象成员间的一一赋值,实现的是一个浅拷贝(logic copy)。

当数据成员里面如果有指针,则编译器默认的赋值运算符不能满足要求,会出现内存泄露。

浅拷贝:通过对象之间的一一赋值,使得对象中的指针指向同一块内存,使得出现了以下三个问题:(1.两次析构同一块内存,系统崩溃;2.修改一个地址造成其他的对象成员被修改;3.当删除一个指针指向的内容,则另一个对象不能正常访问该指针指向内存中的内容。)

在浅拷贝中,是简单的赋值给另一个成员,如果里面有指针,则导致两个对象的指针指向相同的内存。由于指针在两个对象例指向相同的变量,当一个对象改变的时候则另一个对象会跟着改变。另一方面,我们不知道究竟由谁在负责析构指针开辟的堆内存,这样就会出现一下错误。调析构函数则析构两次,破坏内存;不调用析构则没有析构,造成内存泄露。

当类里有成员是指针时,并且动态分配了内存,我们应该重载赋值函数,实现一个深拷贝(physical copy)。

1.首先我们要检查是不是自身赋值,如果是应该立即返回(不要做其他事情);

2.如果不是自身赋值,我们要释放指针所指向的堆内存;

3.把右边对象的成员拷贝并值赋给左边对象的成员值;

4.最后,我们要返回返回本类对象的一个常引用,避免链式赋值(返回const对象引用,不让x=y=z)。
例:
 
 const Vector& Vector::operator=(const Vector& x)         //4
 {
  if(this!=&x)                                     //1
  {
   size=x.size;
   delete [] rep;                           //2
   rep=new int[size];
   for (int i=0; i<size; ++i)
   {
    rep[i]=x.rep[i];                 //3
   }
  }
  return *this;
 }

赋值函数(=,(),[],->)必须重载为成员函数。

“+=,-=,*=,/=”都可以被重载。

 

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值