zoukankan      html  css  js  c++  java
  • C++赋值运算符函数

    为类添加赋值运算符函数:

    类型定义

    class CMyString
    {
    public:
        CMyString(char *pData = NULL);
        CMyString(const CMyString &str);
        ~CMyString(void);
    
        CMyString &operator=(const CMyString &);
    
    private:
        char *m_pData;
    };

    要点:

    1、返回值类型为该类型的引用,并在函数结束前返回实例自身的引用(即 *this);

    2、是否把传入的参数声明为常量引用【const CmyString &str】;

    3、是否释放自身已有内存,否则会造成“内存泄漏”;

    4、是否判断参数与当前示例是指向的同一个对象;

    解法:

    /*
        适用于初级C++程序员的解法
    */
    CMyString &CMyString::operator=(const CMyString &str)
    {
        //首先检测两个指针是否指向同一个对象
        if (this == &str)
            return *this;
    
        //释放原内存
        delete []m_pData;
        m_pData = NULL;
    
        //重新申请内存
        m_pData = new char[strlen(str.m_pData) + 1];
        strcpy(m_pData,str.m_pData);
    
        //谨记:返回*this
        return *this;
    }
    
    
    
    /*
        适用于高级C++程序员的解法
    */
    CMyString &CMyString::operator=(const CMyString &str)
    {
        if (this != &str)                   //确保不指向同一个实例
        {
            CMyString strTemp(str);
    
            char *pTemp = strTemp.m_pData;  //指针指向需要更换的对象
            //strTemp.m_pData指向原来的对象,确保内存不足时可以找到原来对象的值
            strTemp.m_pData = m_pData;      
            m_pData = pTemp;                //更换原对象的值
        }   //自动调用strTemp的析构函数,销毁strTemp对象并回收pTemp的内存
    
        return *this;
    }
  • 相关阅读:
    我认知的javascript之函数调用
    table 的宽度设置无效
    【转】微信读书排版引擎自动化测试方案
    RocksDB原理及应用
    ElasticSearch 架构及应用简介
    芝加哥大学论文写作指南 简述
    python 常用模块
    Flask-SQLAlchemy安装及设置
    selenium设置程序失败后重启
    获取临时IP加入临时列表使用
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3878270.html
Copyright © 2011-2022 走看看