• C++赋值运算符


     1 #include <cstring>
     2 #include <cstdio>
     3 using namespace std;
     4 
     5 class CMyString
     6 {
     7 public:
     8     CMyString(char* pData=nullptr);
     9     CMyString(const CMyString& str);
    10     CMyString& operator=(const CMyString& str);
    11     ~CMyString();
    12 
    13     void Print();
    14 private:
    15     char* m_pData;
    16 };
    17 
    18 CMyString::CMyString(char *pData)
    19 {
    20     if (pData == nullptr)
    21     {
    22         m_pData = new char[1];
    23         m_pData[0] = '';
    24     }
    25     else
    26     {
    27         int length = strlen(pData);
    28         m_pData = new char[length + 1];
    29         strcpy_s(m_pData, length + 1, pData);
    30     }
    31 }
    32 CMyString::CMyString(const CMyString& str)
    33 {
    34     int length = strlen(str.m_pData);
    35     m_pData = new char[length+1];
    36     strcpy_s(m_pData, length + 1, str.m_pData);
    37 }
    38 CMyString::~CMyString()
    39 {
    40     delete[] m_pData;
    41 }
    42 CMyString& CMyString::operator=(const CMyString& str)
    43 {
    44     if (this == &str) return *this;
    45     CMyString strTemp(str);
    46     char* pTemp = strTemp.m_pData;
    47     strTemp.m_pData = m_pData;
    48     m_pData = pTemp;
    49     return *this;
    50 }
    51 void CMyString::Print()
    52 {
    53     printf("%s", m_pData);
    54 }
    View Code

    定义一个赋值运算符时需要考虑的要点:

    1. 把返回值声明为该类型的引用,并在函数结束时前返回实例自身的引用。这样才可以允许连续赋值。
    2. 传入的参数需要声明为常量引用,如果传入的参数不是引用而是实例,则从形参到实参会调用一次复制构造函数。
    3. 释放实例自身已有的内存,如果在分配新内存前忘记释放自己已有的内存,则会出现内存泄漏。
    4. 判断传入参数与当前实例是不是同一个实例,如果是同一个,则立即返回。如果事先不判断会导致严重的问题,一旦释放了自身的内存,传入的参数的内存也同时被释放了,因此再也找不到需要赋值的内容了。
    5. 考虑异常情况,如果使用new时抛出异常,则m_pData指向的内存已被释放,则m_pData将是一个空指针,很容易导致程序崩溃。
  • 相关阅读:
    VC CComboBox用法总结
    WideCharToMultiByte和MultiByteToWideChar函数的用法
    JavaScript
    标题:外星日历
    C语言顺序栈
    C语言循环队列
    每日一题
    标题:李白打酒
    标题:分数
    标题:复数幂
  • 原文地址:https://www.cnblogs.com/larry-xia/p/10631698.html
Copyright © 2020-2023  润新知