C++ 赋值运算符重载
来源:互联网 发布:淘宝手机端装修模板 编辑:程序博客网 时间:2024/06/14 17:04
Widget& operator=(const Widget& rhs) //返回类型是reference
{ //指向当前对象
... //操作当前对象
return* this; //返回左侧对象
}
在一个类里面没有定义(重载)“=”(赋值运算符)时,那么编译器会生成一个默认的赋值函数。它实现对象成员间的一一赋值,实现的是一个浅拷贝(logic copy)。
当数据成员里面如果有指针,则编译器默认的赋值运算符不能满足要求,会出现内存泄露。
浅拷贝:通过对象之间的一一赋值,使得对象中的指针指向同一块内存,使得出现了以下三个问题:(1.两次析构同一块内存,系统崩溃;2.修改一个地址造成其他的对象成员被修改;3.当删除一个指针指向的内容,则另一个对象不能正常访问该指针指向内存中的内容。)
在浅拷贝中,是简单的赋值给另一个成员,如果里面有指针,则导致两个对象的指针指向相同的内存。由于指针在两个对象例指向相同的变量,当一个对象改变的时候则另一个对象会跟着改变。另一方面,我们不知道究竟由谁在负责析构指针开辟的堆内存,这样就会出现一下错误。调析构函数则析构两次,破坏内存;不调用析构则没有析构,造成内存泄露。
当类里有成员是指针时,并且动态分配了内存,我们应该重载赋值函数,实现一个深拷贝(physical copy)。
1.首先我们要检查是不是自身赋值,如果是应该立即返回(不要做其他事情);
2.如果不是自身赋值,我们要释放指针所指向的堆内存;
3.把右边对象的成员拷贝并值赋给左边对象的成员值;
4.最后,我们要返回返回本类对象的一个常引用,避免链式赋值(返回const对象引用,不让x=y=z)。
赋值函数(=,(),[],->)必须重载为成员函数。
“+=,-=,*=,/=”都可以被重载。
- C++:赋值运算符重载
- 重载赋值运算符(c/c++)
- 重载赋值运算符(c++)
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 赋值运算符重载
- 赋值运算符重载
- 重载赋值运算符
- 重载赋值运算符
- 赋值运算符重载
- 赋值运算符重载
- 重载赋值运算符
- 赋值运算符重载函数[C/C++/C#]
- [C++]拷贝构造函数和赋值运算符重载
- android 中电话记录,通讯录与短信的查询
- Oracle数据库语句大全
- 第一篇blog
- 题目1047:素数判定
- 遇到的Spring注解
- C++ 赋值运算符重载
- PorterDuffXfermode的初级使用
- URAL 1409. Two Gangsters
- AngularJS四大核心特性
- Android在子线程更新UI的4种方法
- 电影数据集总结:Netflix、MovieLens、LDOS-CoMoDa、AdomMovie
- 字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。如果字符串参数包含了任何非数字字符,函数就返回零
- JQuery (简化dom操作)
- MySQL多版本并发控制分析