第一题 赋值运算符的重载
来源:互联网 发布:mac用的播放器 编辑:程序博客网 时间:2024/05/21 15:47
要注意的问题:
防止自赋值,是否有内存泄漏,返回值的类型以及参数类型
#include <iostream>using namespace std;class CMystring{public: CMystring(char *pData = NULL) { if(pData == NULL) { m_pData = new char[1]; m_pData = '\0'; } else { m_pData = new char[strlen(pData)+1]; strcpy(m_pData,pData); } } CMystring(const CMystring& src) { m_pData = new char[strlen(src.m_pData)+1]; strcpy(m_pData,src.m_pData); } ~CMystring(void) { delete[]m_pData; } CMystring& operator=(const CMystring &src) { if(this == &src) return *this; delete[] m_pData; m_pData = new char[strlen(src.m_pData)+1]; strcpy(m_pData,src.m_pData); return *this; } void show() { cout<<m_pData<<endl; }private: char* m_pData;};int main(){ CMystring str1; CMystring str2("hello"); CMystring str3; str3 = str2; str3.show(); return 0;}
考虑异常安全性的解法:
在前面的运算符重载函数中,如果new时内存不足,导致抛出异常,m_pData将会是一个空指针,这样很可能引起后面程序的崩溃。
解决的方法有两种,一种是先new,再执行delete,保证了如果new失败了原有的对象未被改变;还有一种办法,创建一个临时对象,再交换与this指向的对象的资源,如果前面调用的拷贝构造函数因内存不足失败了,也不会改变原有对象,如果调用成功,临时对象中保存的原有对象的资源会在出了“}”时被释放掉。
CMystring& operator=(const CMystring &src) { if(this != &src) { CMystring tmp(src); char *p = tmp.m_pData; tmp.m_pData = m_pData; m_pData = p; } return *this; }
阅读全文
0 0
- 第一题 赋值运算符的重载
- 赋值运算符的重载
- 运算符重载--类的赋值运算符重载
- 运算符重载-赋值运算符的重载
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 重载赋值运算符
- 赋值运算符重载
- 赋值运算符重载
- 重载赋值运算符
- 重载赋值运算符
- 赋值运算符重载
- 赋值运算符重载
- 重载赋值运算符
- 赋值运算符的重载函数
- for循环的练习
- Python学习——控制流
- PAT a1032题解
- Windows 如何让环境变量设置后 立即生效
- mybatis学习
- 第一题 赋值运算符的重载
- dispatcherServletController参数填充源码
- css的三大特性
- PAT a1033题解
- 浅谈UITableview 的优化
- 离散化--uva12171 Sculpture
- hibernate模糊查询criteria封装参数
- 修改cmd的默认路径
- 《华为机试在线训练》之字符个数统计