题目一:赋值运算符函数
Posted yzdai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题目一:赋值运算符函数相关的知识,希望对你有一定的参考价值。
/////////////////////////////////////////////////////////////////////////////////////////////
// 3.题目一:赋值运算符函数
class CMyString
public:
// 默认函数
CMyString();
CMyString(const CMyString&);
CMyString& operator=(const CMyString&);
~CMyString();
void SetString(const char* pszStr)
// 释放旧数据
Destroy();
CopyData(pszStr);
void Print()
if (m_pszData)
cout << m_pszData << endl;
void Destroy()
if (m_pszData)
delete [] m_pszData;
m_pszData = NULL;
void CopyData(const char* pszStr)
if (pszStr)
int iLen = strlen(pszStr);
m_pszData = new char[iLen + 1];
strncpy(m_pszData, pszStr, iLen + 1);
m_pszData[iLen] = ‘\0‘;
private:
char* m_pszData;
;
// 默认构造函数
CMyString::CMyString()
:m_pszData(NULL)
//拷贝构造函数
CMyString::CMyString(const CMyString& other)
cout << "CMyString Copy Constructor!!!!" << endl;
// 释放旧数据
//Destroy(); // 这里不能释放,因为没有初始化
CopyData(other.m_pszData);
//赋值操作符
CMyString& CMyString::operator=(const CMyString& other)
cout << "CMyString Assignment Operator!!!!" << endl;
#if 0 // 初级程序员!!!!
if (this != &other)
Destroy();
CopyData(other.m_pszData);
#else
//高级程序员 需要考虑异常 --> 内存不足,导致new char 抛出异常
// 实现异常安全性:
// 1.先new分配新内容在使用delete释放旧内容 --> 确保抛出异常时原来的数据不会被改变!!!
// 2.先创建一个临时实例,再交换临时实例和原来的内容 --> 推荐这种方法!!!!
if (this != &other)
// 调用拷贝构造函数创建临时实例
CMyString strTmp(other);
char * pTmp = strTmp.m_pszData;
strTmp.m_pszData = m_pszData; // strTmp调用析构函数时,会释放原来实例中的m_pszData!!!!
m_pszData = pTmp;
#endif
return *this;
//析构函数
CMyString::~CMyString()
Destroy();
void MyStringTestFunc()
cout << "\n\n --------------- MyStringTestFunc Start -------------->" << endl;
CMyString str1;
str1.SetString("Hello World!");
str1.Print();
CMyString str2(str1); // 调用拷贝构造函数
str2.Print();
CMyString str3 = str1; // 调用拷贝构造函数 等同于CMyString str3(str1)
str3.Print();
CMyString str4;
str4 = str1; // 赋值操作符
str4.Print();
cout << "\n\n --------------- MyStringTestFunc End -------------->" << endl;
以上是关于题目一:赋值运算符函数的主要内容,如果未能解决你的问题,请参考以下文章