zoukankan      html  css  js  c++  java
  • 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将是一个空指针,很容易导致程序崩溃。
  • 相关阅读:
    使用FormatterServices 类序列化或反序列化
    HaozesFx(飞信精灵)发布
    EF Provider for Access/ODBC 以及ADO.Net Entity Framework 与Linq to SQL的比较和适用场景:
    Fetion2008 分析 Part3:会话
    Gleaner(个人文档管理)
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.
    发一个收取Pop3邮件的代码
    码农架构技术周刊 | 第1期
    这样学Redis,才能技高一筹!
    CommunityServer2.1删除anonymous帐号后的解决办法
  • 原文地址:https://www.cnblogs.com/larry-xia/p/10631698.html
Copyright © 2011-2022 走看看