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

题目来源于《剑指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[];
m_pData[] = '\0';
}
else
{
int length = strlen(pData);
m_pData = new char[length + ];
//复制
/*
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 + ]; //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 ;
}

赋值运算符函数__from <剑指Offer>的更多相关文章

  1. 【剑指offer】包括min函数的栈

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26064213 剑指offer上的第21题,之前在Cracking the Coding i ...

  2. 剑指Offer——常用SQL语句、存储过程和函数

    剑指Offer--常用SQL语句.存储过程和函数 常用SQL语句 1.在MySQL数据库建立多对多的数据表关系 2.授权.取消授权 grant.revoke grant select, insert, ...

  3. 【Java】 剑指offer(30) 包含min函数的栈

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min ...

  4. 《剑指offer》 包含min函数的栈

    本题来自<剑指offer> 包含min函数的栈 题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 思路: 举例子让抽象问题具体 ...

  5. 剑指offer(20)包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...

  6. 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

    弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉 ...

  7. 剑指Offer - 九度1522 - 包含min函数的栈

    剑指Offer - 九度1522 - 包含min函数的栈2013-12-01 23:44 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测 ...

  8. 剑指Offer(二十):包含min函数的栈

    剑指Offer(二十):包含min函数的栈 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ba ...

  9. Go语言实现:【剑指offer】包含min函数的栈

    该题目来源于牛客网<剑指offer>专题. 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数. 时间复杂度应为O(1). Go语言实现: var myList = ...

随机推荐

  1. Hyperledger Fabric 1.0 从零开始(三)——环境构建(内网/准离线)

    有公网环境的服务器可以直接看 Hyperledger Fabric 1.0 从零开始(二)--环境构建(公网) ,本篇内容与上篇相似,只不过环境搭建需要在内网下,也就是网络被限制的情况下. 1:环境构 ...

  2. java向前引用

    根据看书和看得文章,引出了一个关于"向前引用"的问题: public class InstanceInitTest { static { // { a = 6; System.ou ...

  3. ops-web运维平台-create.jsp-mootools下拉框-复选框

    create.jsp页面的,body部分 <body onload="Page.init('${pageError}','${pageMessage}',${isSubmit},tru ...

  4. 谈一谈最近学了一段时间的node.js

    官方说明 1.NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”. 2.node是一个基于Chrome V8引擎进行代码解释的.轻量.可伸缩的具有事件驱动和非阻塞I/O机制的js运 ...

  5. WebSocket In ASP.NET Core(二)

    WebSocket In ASP.NET Core(二) Server in ASP.NET-Core DI in ASP.NET-Core Routing in ASP.NET-Core Error ...

  6. 用vue开发一个app(3,三天的成果)

    前言 一个vue的demo 源码说明 项目目录说明 . |-- config // 项目开发环境配置 | |-- index.js // 项目打包部署配置 |-- src // 源码目录 | |-- ...

  7. 我的python学习笔记一

    我的python学习笔记,快速了解python,适合有C语言基础的. http://note.youdao.com/noteshare?id=93b9750a8950c6303467cf33cb1ba ...

  8. Opengl4.5 中文手册—D

    索引 A      B    C      D     E     F     G H      I     J      K     L     M     N O      P    Q      ...

  9. 用sqlserver的自定义函数直接获取多级部门全名

    好久没写存储过程了,今日正好同事的开发需要,实现显示多级部门的部门全名称. 如 财务部/会计部/会计一部   部门表 人员表 函数 getOrgAllName --OrgID 72 当前的部门ID A ...

  10. asp.net core后台系统登录的快速构建

    登录流程图 示例预览 构建步骤 当然,你也可以直接之前前往coding仓库查看源码,要是发现bug记得提醒我啊~ LoginDemo地址 1. 首先你得有一个项目 2. 然后你需要一个登录页面 完整L ...