更优雅的类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,内存的分配和释放都自动完成,因此代码显得比较优雅。
 

实现CMyString类--深拷贝与浅拷贝

实现CMyString类,实现赋值运算符函数(深拷贝与浅拷贝) 深拷贝:赋值运算符函数说明 步骤1、释放原来的内存空间 步骤2、再重新开辟要赋值的对象的大小的空间 步骤3、再将另一个对象的值拷贝给th...
  • kkmdmcgxi
  • kkmdmcgxi
  • 2016年05月08日 21:45
  • 470

C/C++笔记--String类的书写及易错点分析

CMyString { public: CMyString(const char* pData = NULL); CMyString(const CMyString &other); ...
  • ZH___xin
  • ZH___xin
  • 2016年08月20日 12:22
  • 350

剑指offer面试题:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。

题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 class CMyString { public: CMyString(char* pData = NULL); ...
  • yanxiaolx
  • yanxiaolx
  • 2016年07月17日 15:48
  • 760

pring RestTemplate: 比httpClient更优雅的Restful URL访问

[javascript] view plain copy   {     "Author": "tomcat and jerry",     "url":"http://www.cnblo...
  • fjnpysh
  • fjnpysh
  • 2017年04月07日 12:48
  • 306

CMyString实现

xxxx
  • wenmang1977
  • wenmang1977
  • 2014年08月14日 18:00
  • 521

CMyString的实现

面向对象的编程,首先得设计出良好的类体结构和接口,然后是合理的实现. 如何自己设计并实现一个字符串类?这个问题看似简单,其实里面也有不少的玄机. class CMyString { p...
  • zqt520
  • zqt520
  • 2012年10月02日 11:19
  • 480

55 题目 类 CMyString 的声明,构造函数

/* 55. 题目:类 CMyString 的声明如下: class CMyString { public: CMyString(char* pData = NULL); CMyString(...
  • u012605629
  • u012605629
  • 2014年10月09日 19:20
  • 573

CMystring类实现以及返回值的理解

///////////////////////////////////////////////////////////////////// // Filename: mystring.h //////...
  • damotiansheng
  • damotiansheng
  • 2014年02月18日 15:03
  • 617

如何更优雅的实现标题栏

前言 做Android这么久了,目前见过实现标题栏的方式无非两种 1.在每一个Activity的xml中include一个共有的标题栏xml,然后在Activity的生命周期方法onCreate方...
  • u011692041
  • u011692041
  • 2017年11月10日 16:23
  • 326

JAVA自定义异常类的一种实现方式

/* *自定义异常类 */ public class UnsupportedShapeException extends Exception{     private static fin...
  • hello_yz
  • hello_yz
  • 2012年12月08日 21:33
  • 692
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:更优雅的类CMyString的实现
举报原因:
原因补充:

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