更优雅的类CMyString的实现

原创 2007年09月24日 19:41:00
class CMyString
{
public:
      CMyString(char* pData = NULL);
      CMyString(const CMyString& str);
      ~CMyString(void);
      CMyString& operator = (const CMyString& str);

private:
      char* m_pData;
};
请实现其赋值运算符的重载函数,要求异常安全,即当对一个对象进行赋值时发生异常,对象的状态不能改变。
分析:首先我们来看一般C++教科书上给出的赋值运算符的重载函数:
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) + 1];
      strcpy(m_pData, str.m_pData);

      return *this;
}
我们知道,在分配内存时有可能发生异常。当执行语句new char[strlen(str.m_pData) + 1]发生异常时,程序将从该赋值运算符的重载函数退出不再执行。注意到这个时候语句delete []m_pData已经执行了。也就是说赋值操作没有完成,但原来对象的状态已经改变。也就是说不满足题目的异常安全的要求。
为了满足异常安全这个要求,一个简单的办法是掉换new、delete的顺序。先把内存new出来用一个临时指针保存起来,只有这个语句正常执行完成之后再执行delete。这样就能够保证异常安全了。
下面给出的是一个更加优雅的实现方案:
CMyString& CMyString::operator =(const CMyString &str)
{
      if(this != &str)
      {
            CMyString strTemp(str);

            char* pTemp = strTemp.m_pData;
            strTemp.m_pData = m_pData;
            m_pData = pTemp;
      }

      return *this;
}
该方案通过调用构造拷贝函数创建一个临时对象来分配内存。此时即使发生异常,对原来对象的状态没有影响。交换临时对象和需要赋值的对象的字符串指针之后,由于临时对象的生命周期结束,自动调用其析构函数释放需赋值对象的原来的字符串空间。整个函数不需要显式用到new、delete,内存的分配和释放都自动完成,因此代码显得比较优雅。
 

对比.net使用Java的匿名类对工厂方法模式提供更优雅的实现

工厂模式的意图:定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。结构图:场景:这里制造两个手机product:Nokia、Motorol...

iOS富文本编辑器之更"优雅的"实现方法

前言:最近帮公司的一名程序员搞一个项目的收尾工作,差一个富文本编辑器功能未实现,时间紧迫,调研了下网上的解决方法均较为繁琐. 不得已找了个别门来实现该问题,且看下文 需要实现的效果 需...

如何更优雅的实现ExtJS的前端MVC模式下一个App多个Controller的动态加载

尊重原创,如需转载,请务必注明原文地址:http://www.cnblogs.com/Raoh/archive/2013/04/01/ExtJS_MVC_Controller.html 注:...

TabLayout使ViewPager更优雅的滑动切换

  • 2016年04月06日 10:20
  • 8.24MB
  • 下载

LoadingBar - 如何更优雅的使用Loading

转载请注明出处: http://blog.csdn.net/aa464971/article/details/51372204 Android交流群:146262062 前言我们平时在开发的时候,发起...

如何更优雅的书写Javascript之告别回调地狱

什么是回调地狱? PS: 某大牛说过,世上本没有多层回调嵌套,写的人多了也便有了。 下面我们举个例子 在使用jquery animat做多个动画效果的时候,可能很多的童鞋写出过如下的...
  • vuturn
  • vuturn
  • 2015年04月13日 13:42
  • 3969

学习这些设计模式,让你写出更优雅的代码

写代码容易,写出优雅的代码难,写易于维护的、容易扩展的、结构清晰的代码应该是每位开发者努力的目标,而学习设计模式,合理的的使用能让我们离这个目标更进一步。最近看了《Javascript 设计模式与开发...

Android之版本-更优雅的 Android 发布自动版本号方案

以前看到一些自动化版本号打包的文章。如果您的项目是用 Git 管理的,并且恰巧又是使用 Gradle 编译(应该绝大部分都是这样的了吧?),本文试图找到一种更加优雅的自动版本管理方法。 1 背景 ...
  • lqhed
  • lqhed
  • 2016年12月07日 11:58
  • 488

Android开发之更优雅的使用Loading

Loading 是很普遍的需求,比如请求的时候需要显示 Loaing ,而一般的实现方式是在布局xml里添加一个 ProgressBar,但是这样写就有很多不便,每个页面的 layout 都要写一个 ...

MVP开发框架再试-程序员如何更优雅的看直播

MVP项目github地址https://github.com/SuperMan42/MVPApp based on Material Design + MVP + Rxjava + Retrofit...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:更优雅的类CMyString的实现
举报原因:
原因补充:

(最多只允许输入30个字)