赋值运算符函数__from <剑指Offer>

        前段时间忙于项目,难得偷得几日闲,为即将到来的就业季做准备。在面试时,应聘者要注意多和考官交流,只有具备良好的沟通能力,才能充分了解面试官的需求,从而有针对性地选择算法解决问题。

        题目来源于《剑指Offer》,自己在原有基础上稍作批注和修改。

        问题:为类型添加赋值运算符函数,可以把CMyString实例赋值给另一个实例、自身和连续赋值。

        学习点:考虑问题充分,自己不会把赋值情况、内存泄漏考虑到这么细致。

#include<cstring>
#include<cstdio>

class CMyString
{
public:
    CMyString(char * pData = nullptr);
    CMyString(const CMyString& str);
    ~CMyString(void);
    CMyString& operator=(const CMyString& str);
    void Print();

private:
    char* m_pData;  //类比C风格字符串
};

CMyString::CMyString(char * pData)
{
    if (pData==nullptr)  //空指针
    {
        //创建空字符串
        m_pData = new char[1];
        m_pData[0] = '\0';
    }
    else
    {
        int length = strlen(pData);
        m_pData = new char[length + 1];
        //复制
        /*
            char * strcpy(char * destination, const char * source);
            Copies the C string pointed by source into the array pointed by destination, including the terminating null character(and stopping at that point).
        */
        strcpy(m_pData, pData);
    }
}

CMyString::CMyString(const CMyString& str)
{
    int length = strlen(str.m_pData);  //Returns the length of the C string str. The length of a C string is determined by the terminating null - character
    m_pData = new char[length + 1];  //new分配内存后,默认使用delete释放对象
    strcpy(m_pData, str.m_pData);
}

CMyString::~CMyString(void)
{
    delete[] m_pData;
}

//1. 返回值的类型声明为该类型的引用,程序结束前返回实例自身的引用(*this)
//2. 传入的参数的类型声明为常量引用
//3. 释放实例自身的内存
//4. 判断传入的参数和当前的实例是不是同一个实例
//5. 升级:考虑异常安全性的解法 先new再delete
CMyString& CMyString::operator=(const CMyString& str)  //参考2
{
    if (this != &str)  //参考4
    {
        CMyString strTemp(str);  //临时实例
        //参考3
        char* pTemp = strTemp.m_pData;
        strTemp.m_pData= m_pData;
        m_pData = pTemp;
    }//调用strTemp的析构函数,释放其内存
    //参考1
    return *this;
}

//=================  测试代码  ==================
void CMyString::Print()
{
    printf("%s", m_pData);
}

void Test1()
{
    printf("Test1 begins:\n");

    char* text = "Hello world";

    CMyString str1(text);
    CMyString str2;
    str2 = str1;

    printf("The expected result is: %s.\n", text);

    printf("The actual result is: ");
    str2.Print();
    printf(".\n");
}

// 赋值给自己
void Test2()
{
    printf("Test2 begins:\n");

    char* text = "Hello world";

    CMyString str1(text);
    str1 = str1;

    printf("The expected result is: %s.\n", text);

    printf("The actual result is: ");
    str1.Print();
    printf(".\n");
}

// 连续赋值
void Test3()
{
    printf("Test3 begins:\n");

    char* text = "Hello world";

    CMyString str1(text);
    CMyString str2, str3;
    str3 = str2 = str1;

    printf("The expected result is: %s.\n", text);

    printf("The actual result is: ");
    str2.Print();
    printf(".\n");

    printf("The expected result is: %s.\n", text);

    printf("The actual result is: ");
    str3.Print();
    printf(".\n");
}

int main(int argc, char* argv[])
{
    Test1();
    Test2();
    Test3();
    getchar();  //等待输入
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏移动端开发

Swift 2.2 多态和强制转换

 写在前面:     写点东西,就是想告诉自己,有时间其实你也在前进着,快慢不说,至少没停下吧!该有的都会有的。不瞎BB了,说主题,3.0 的多态和继承。  ...

1736
来自专栏软件开发 -- 分享 互助 成长

数据库的规范化

一、基础概念 实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等。 属性:教科书上解释为:“实体所具有的某一特性”,由此可见...

1676
来自专栏java一日一条

Java hashCode() 方法深入理解

Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色。在一些类中覆写这两个方法以完...

281
来自专栏GreenLeaves

C# int? 关键字

1、int?  关键字说明 (1)、int? 表示一个int类型,且该int类型可空,如果不加?的话,那么int类型的默认值为0,不能赋null值,代码如下: ...

18310
来自专栏云霄雨霁

词法分析程序

1390
来自专栏精讲JAVA

lambda 表达式和闭包

区分lambda表达式和闭包 熟悉的Javascript或者Ruby的同学,可能对另一个名词:闭包更加熟悉。因为一般闭包的示例代码,长得跟lambda差不多,导...

3339
来自专栏about云

Scala的map实现key和value排序及各种排序比较等知识讨论

问题导读 1.map能否直接排序? 2.如何转换,才能排序? 3.排序结果可以存储在哪两个集合中? 4._*如何使用? 5.排序函数中,哪个可以进行升序和降序...

3348
来自专栏Android群英传

Swift vs. Kotlin 漫谈之函数定义

1135
来自专栏noteless

java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类

java集合框架  框架设计理念  容器 继承层级结构 继承图 集合框架中的抽象类  主要的实现类 实现类特性   集合框架分类 集合框架并发包 并发实现类

882
来自专栏技术点滴

《Effective C++》读书摘要

《Effective C++》读书摘要 最近刚读完侯捷的《Effective C++》,相对来说,这本书的内容比较贴近基础,对于刚掌握C++基础的人会有不少的提...

1646

扫码关注云+社区