博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 赋值运算符重载
阅读量:2442 次
发布时间:2019-05-10

本文共 753 字,大约阅读时间需要 2 分钟。

Widget& operator=(const Widget& rhs)        //返回类型是reference  

{                                                                               //指向当前对象

...                                                                              //操作当前对象

return* this;                                                         //返回左侧对象

}

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

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

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

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

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

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

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

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

4.最后,我们要返回返回本类对象的一个常引用,避免链式赋值(返回const对象引用,不让x=y=z)。

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

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

转载地址:http://lviqb.baihongyu.com/

你可能感兴趣的文章
Ubuntu Linux:定制Ubuntu安装CD(转)
查看>>
调查显示:企业级Linux用户不断攀升(转)
查看>>
SCO UNIX学习宝典 高级进阶(转)
查看>>
Oracle9i RAC for RedFlag Linux DC4.1 32bit 安装流程(转)
查看>>
Sybase和Oracle安装过程中常遇到的问题(转)
查看>>
红帽Linux新系统整合虚拟技术 实现简易操作(转)
查看>>
Linux下/etc/default/boot文件字段说明(转)
查看>>
使用带有Dtrace的FreeBSD(转)
查看>>
Fedora Core 4硬盘安装方法(转)
查看>>
常用的系统状态查询命令(转)
查看>>
『推荐』上G的linux视频教程和电子书FTP下载,速度快内容实用!(转)
查看>>
Fedora Core 6的新特性(转)
查看>>
不得不说 僵尸网络导致垃圾邮件猛增(转)
查看>>
linux网络知识:TCP/IP设置内容(转)
查看>>
GNOME帮助Linux应用于商业桌面环境(转)
查看>>
linux网络知识:与网络设置有关的几个文件(转)
查看>>
Linux文件内容查询命令(转)
查看>>
libc.a 文件恢复(转)
查看>>
SCO UNIX上cpio命令详细用法(转)
查看>>
Linux系统可卸载内核模块完全指南(下)(转)
查看>>