题目:如下类型为CMyString的声明,请为该类型添加赋值运算符函数。
 
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(); private:
char* m_pData;
};
关注点:
 
     1.是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(即*this)。只有返回一个引用,才可以允许连续赋值(str1=str2=str3);
     2.是否把传入的参数的类型声明为常量引用。如果传入的的参数不是引用而是实例,那么从形参到实参会调用一次复制构造函数。把参数声明为引用可以避免这种无谓的消耗,提高代码效率。同时,我们在赋值运算符函数内不会改变传入实例的状态,因此该为传入的引用参数加上const关键字;
     3.是否释放实例自身已有的内存。如果我们忘记在分配新内存之前释放自身已有的空间,程序将出现内存泄漏;
     4.是否判断传入的参数和当前实例(*this)是不是同一个实例。如果是同一个,则不进行赋值操作,直接返回。如果事先不判断就进行赋值那么在释放实例自身的内存的时候就会导致严重的问题。当*this和传入的参数是同一个实例时,那么一旦释放了自身的内存,传入的参数的内存也同时被释放了,因此再也找不到需要赋值的内容了。
 
解法一:经典的解法
     
  当完整的考虑上述四个方面后,写下如下代码。
CMyString& CMyString::operator =(const CMyString& str)
{
if (this == &str)
{
return *this;
} delete[] m_pData;
m_pData = NULL; m_pData = new char[strlen(str.m_pData) + ];
strcpy(m_pData, str.m_pData); return *this;
}
解法二:考虑异常安全性
 
     我们在分配内存之前先用delete释放了实例m_pData的内存。如果此时内存不足导致new char抛出异常,m_pData将是一个空指针,这样非常容易造成程序崩溃。要想在赋值运算符函数中实现异常安全性,有两种方法。一个简单的办法是我们先用new分配新内容再用delete释放已有的内容。这样只在分配内容成功之后再释放原因的内容,也就是当分配内存失败时我们能确保CMyString的实例不会被修改。还有一个更好的办法是先创建一个临时实例,再交换实例和原来的实例。
 
CMyString& CMyString::operator =(const CMyString& str)
{
if (this != &str)
{
CMyString strTemmp(str); char* pTemp = strTemmp.m_pData;
strTemmp.m_pData = m_pData;
m_pData = pTemp;
} return *this;
}
 
 
 

最新文章

  1. iOS开发使用半透明模糊效果方法整理
  2. 【cpp】Vector
  3. PRML读书会第八章 Graphical Models(贝叶斯网络,马尔科夫随机场)
  4. springmvc视图解析流程
  5. 同时大量PPPoE连接请求,攻击PPPoE服务器,导致的用户异常掉线故障分析
  6. [IR] Boolean retrieval
  7. Java IO之序列化
  8. 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore
  9. Could not execute auto check for display colors using command /usr/bin/xdpyinfo.(
  10. java课程设计--We Talk(201521123061)
  11. TCP/IP协议全解析 三次握手与四次挥手[转]
  12. 《团队-OldNote-项目总结》
  13. python中的__dict__,__getattr__,__setattr__
  14. 在<canvas>上绘制img(drawImage())时需要注意的事
  15. Android里透明的ListView
  16. mybatis 的批量更新操作sql
  17. X-UA-compatible浅谈
  18. Apache2.4配置总结(转)
  19. bzoj1196 公路修建问题
  20. 可缺省的CSS布局——张鑫旭

热门文章

  1. XMind双十一会放什么大招?
  2. dp入门(先摆在这里,之后细细读)
  3. day10 强制类型转换(更新)
  4. java导出html页面
  5. 利用Java反射机制对实体类的常用操作工具类ObjectUtil
  6. Job for mysqld.service failed because the control process exited with error code
  7. vue调试工具vue-devtools的安装
  8. nfs+inotify
  9. 小学生都能学会的python(字典{ })
  10. 从CSDN搬过来