拷贝构造函数和赋值操作符复载
来源:互联网 发布:淘宝助理模板设置 编辑:程序博客网 时间:2024/05/29 16:17
拷贝构造函数其实也是构造函数,只不过它的参数是const的类自身的对象的引用。如果类里没有指针成员(该指针成员指向动态申请的空间),是没有必要编写拷贝构造函数的。
拷贝构造函数常用的三种情况:
(1)定义新对象,用已有对象初始化新对象
(2)对象直接作为参数传递给函数
(3)当函数中的局部对象被返回给函数调用
class CExample{public : CExample(){pBuffer=NULL; nSize=0;} ~CExample(){delete pBuffer;} CExample(const CExample&); //拷贝构造函数 void Init(int n){ pBuffer=new char [n]; nSize=n;}private : char *pBuffer; //类的对象中包含指针,指向动态分配的内存资源 int nSize;};CExample::CExample(const CExample& RightSides) //拷贝构造函数的定义{ nSize=RightSides.nSize; //复制常规成员 pBuffer=new char [nSize]; //复制指针指向的内容 memcpy(pBuffer,RightSides.pBuffer,nSize*sizeof (char ));}
赋值操作符重载:用户在使用语句ObjB = ObjA的时候,或许ObjB的pStr已经指向了动态申请的空间,如果直接简单将其指向的地址覆盖,就会导致内存泄露,所以需要对=赋值操作符进行重载,在重载函数中判断pStr如果已经指向了动态申请的空间,就先将其释放。
class CExample{ ... CExample(const CExample&); //拷贝构造函数 CExample& operator = (const CExample&); //赋值符重载 ...};//赋值操作符重载CExample & CExample::operator = (const CExample& RightSides){ nSize=RightSides.nSize; //复制常规成员 char *temp=new char [nSize]; //复制指针指向的内容 memcpy(temp,RightSides.pBuffer,nSize*sizeof (char )); delete []pBuffer; //删除原指针指向内容 (将删除操作放在后面,避免X=X特殊情况下,内容的丢失) pBuffer=temp; //建立新指向 return *this }
拷贝构造函数和赋值操作符重载的关系:
赋值操作符重载比拷贝构造函数做得要多,它除了完成拷贝构造函数所完成的拷贝动态申请的内存的数据之外,还释放了原本自己申请的内存空间。所以最后给出的拷贝构造函数的实现可以用赋值操作符的重载来完成。
0 0
- 拷贝构造函数和赋值操作符复载
- C++拷贝构造函数和赋值操作
- 拷贝构造函数和赋值操作符
- 赋值操作符和拷贝构造函数
- 赋值操作符和拷贝构造函数
- 拷贝构造函数和赋值操作符
- 赋值操作符和拷贝构造函数
- 赋值操作符和拷贝构造函数
- 赋值操作符和拷贝构造函数
- 拷贝构造函数和赋值操作符
- 赋值操作符和拷贝构造函数
- 拷贝构造函数和赋值操作符
- C++拷贝构造函数和拷贝/赋值操作符
- 如何分辨拷贝构造函数和赋值操作符两种操作
- 赋值和拷贝构造函数
- 拷贝构造和赋值函数
- 拷贝构造函数和拷贝赋值函数
- 拷贝构造函数和赋值构造函数
- 进程间通信之信号signal
- mysql中获取一天、一周、一月时间数据的各种sql语句写法
- EF中出现列映射丢失
- 单例模式及原理
- 开发 Spring 自定义视图和视图解析器
- 拷贝构造函数和赋值操作符复载
- iOS-NSDate 相差 8 小时
- 关于继承和多态的小程序
- SolrCloud Collection API 列表(基于Solr 5.0.0)
- java日志组件介绍(common-logging,log4j,slf4j,logback )
- 字符串反转
- 人脸识别技术大总结(1):Face Detection & Alignment
- 李白打酒
- 如何打造数据驱动的文化