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;
    }
  • 相关阅读:
    PTA习题解析——银行排队问题
    线性表结构详解
    SkipList (跳跃表)解析及其实现
    C++面向过程编程
    WEB 性能测试用例设计以及总结
    PHP设计模式概述
    影响Linux发展的四位天才黑客
    从Linux 与 Unix 异同,看开源世界的发展!
    移动开发的跨平台技术演进
    AI和机器学习对云应用的安全产生了何种影响?
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3878270.html
Copyright © 2011-2022 走看看