• 剑指offer-0x01


    赋值运算函数

    对于定义一个赋值运算符函数时,需要注意一下几点:

    函数的返回类型必须是一个引用,因为只有返回引用,才可以连续赋值

    传入的参数声明为常量引用,可以提高代码效率,同时赋值运算函数内不会改变传入的实例状态

    一定要记得释放实例自身已有的内存,否则程序容易出现内存泄露

    注意传入的参数和当前的实例是不是同一个实例,如果是同一个,则不用进行赋值操作,直接返回即可

    自己的代码 求鄙视

    //main.h
    #ifndef MAIN_H_INCLUDED
    #define MAIN_H_INCLUDED
    
    class CMyString
    {
    
    public:
        CMyString(char* pData = NULL);
        CMyString(const CMyString & str);
        char* getStr();
        ~CMyString();
    
        CMyString& operator = (const CMyString &str);
    private:
        char* m_pdata;
    
    
    };
    
    
    #endif // MAIN_H_INCLUDED
    
    
    //main.cpp
    #include <iostream>
    #include <cstring>
    #include "main.h"//must use "" not <>
    using namespace std;
    
    CMyString& CMyString::operator = (const CMyString &str)
    {
        if (this == &str)
            return *this;//if itself = itself then return directly
            //in case delete itself when delete
            delete []m_pdata;
            m_pdata = NULL;
            m_pdata = new char[strlen(str.m_pdata)+1];
            strcpy(m_pdata,str.m_pdata);
            return *this;//return a value
    }
    char* CMyString::getStr()
    {
        return m_pdata;
    }
    CMyString::CMyString(char* pData)
    {
        int length = strlen(pData);
            m_pdata = new char[length+1];
            strcpy(m_pdata,pData);
    }
    
    CMyString::~CMyString()
    {
        delete []m_pdata;
    }
    int main()
    {
        CMyString str("i love china!");
        CMyString str1;
        str1 = str;
        cout<<str1.getStr()<<endl;
        cout << "Hello world!" << endl;
        return 0;
    }
    
    E:CodeBlocksoperatormain.h|14|error: 'char* CMyString::m_pdata' is private|

    别人的代码

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    class CMyString
    {
    public:
        CMyString(char *pData=NULL);
        CMyString(CMyString &str);
        CMyString& operator=(CMyString &str);
        ~CMyString(void);
        void Print(){ cout << m_pData; }
    private:
        char* m_pData;
    
    };
    
    CMyString::CMyString(char *pData)
    {
        if (NULL == pData)
        {
            m_pData = NULL;
            return;
        }
        else
        {
            unsigned int len = strlen(pData)+1;
            m_pData = new char[len];
            for (int i = 0; i < len; i++)
                m_pData[i] = pData[i];
            m_pData[len] = '';
        }
    }
    
    CMyString::CMyString(CMyString &str)
    {
        unsigned int len = strlen(str.m_pData) + 1;
        m_pData = new char[len];
        for (int i = 0; i < len; i++)
            m_pData[i] = str.m_pData[i];
        m_pData[len] = '';
    }
    
    CMyString & CMyString::operator=(CMyString &str)
    {
        if (this == &str)
            return *this;
        else
        {
            unsigned int len = strlen(str.m_pData) + 1;
            char *pTemp = new char[len];
            for (int i = 0; i < len; i++)
                pTemp[i] = str.m_pData[i];
            pTemp[len] = '';
    
            delete[]m_pData;//出错!!!不解
    
            m_pData = pTemp;
    
        }
        return *this;
    }
    
    CMyString::~CMyString()
    {
        delete [] m_pData;
    }
    
    int main()
    {
        char c1[10] = "majunfu";
        CMyString s1(c1);
        CMyString s2 = s1;
        s1 = s2;
        s1.Print();
        s2.Print();
        return 0;
    }
    
    keep calm and carry on
  • 相关阅读:
    服务器磁盘脱机无法挂载
    go 字符串操作相关
    golang 系列:atomic 原子操作
    UUID简介及 Golang实现
    go 图片base64转二进制
    golang go 中字符串和各种int类型之间的相互转换方式
    Go 获取当前时间 时间格式的转换 秒、毫秒、纳秒时间戳输出
    Go语言中调用C语言类型转换篇
    Supervisor 部署go gin服务 或在Linux下面独立部署
    Go语言对字符串进行SHA1 哈希运算的方法
  • 原文地址:https://www.cnblogs.com/geekvc/p/6657326.html
Copyright © 2020-2023  润新知