题目一:赋值运算符函数

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;

以上是关于题目一:赋值运算符函数的主要内容,如果未能解决你的问题,请参考以下文章

赋值运算符函数

面试题1:赋值运算符函数

[剑指offer]面试题1:赋值运算符函数

剑指offer-赋值运算符函数

《剑指Offer》——试题1:赋值运算符函数

C++ ——赋值运算符重载函数