题目:类CMyString的声明如下:
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
private:
char* m_pData;
};
请实现其赋值运算符的重载函数,要求异常安全,即当对一个对象进行赋值时发生异常,对象的状态不能改变。
/*
Name:
Copyright:
Author:
Date: 23-06-11 17:39
Description: :类CMyString的声明如下:
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
private:
char* m_pData;
};
请实现其赋值运算符的重载函数,要求异常安全,即当对一个对象进行赋值时发生异
常,对象的状态不能改变。
*/
#include<iostream>
#include<iomanip>
using namespace std;
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
private:
char* m_pData;
};
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;
}
// 这是针对数组的情况( char* m_pData 是一个字符数组) 自动获得自我赋值安全性。
//异常安全性指:指针指向一块不存在的内存
class widget
{
...
private:
Bitmap *pb;
};
Widget & Widget::operator=(const Widget &rhs)
{
if(this==&rhs) return *this;
delete pb;
pb=new Bitmap(*rhs.pb);
return *this;
}
//以上代码不具备异常安全性,如果“new Bitmap”导致异常,会有一个指针指向一块被删除的Bitmap
Widget & Widget::operator=(const Widget &rhs)
{
Bitmap *pOrig=pb;
pb=new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
//以上代码自动获得自我赋值安全性,并且具备异常安全性
int main()
{
system("pause");
return 0;
}