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

题目来源于《剑指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. 201521123005《Java程序设计》第十三周学习总结

    1. 本周学习总结 1.网络基本概念 2.网络常用命令 ipconfig 查看网络配置信息,如ip地址 ping 测试网络是否连通 telnet 远程登录 ftp 登陆ftp Fport (xp下)查 ...

  2. Java课程设计-计算器 丁树乐(201521123024)

    1.团队课程设计博客链接 http://www.cnblogs.com/br0823/p/7064407.html 2.个人负责模块或任务说明 界面优化 各类之间拼接 3.自己的代码提交记录截图 4. ...

  3. junit initializationError和找不到或无法加载主类

    今天在做Junit测试的时候 出现了initialzationError , 在网上查找,一般都是因为Jar 包冲突或者缺少Jar包导致的, 但是我的其他方法是可以使用Junit 的, 所以感觉应该跟 ...

  4. 使用Gateway-Worker实现多人分组实时聊天 结合第三方tp

    一.基础知识1.Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架.被广泛的用于手机app.移动通讯等领域的开发. 支持TCP长连接,支持Websocket.HTTP等 ...

  5. display:flex css

    本文介绍下flex的用法和属性 这个一个自适应的3列盒子 <div class="flex"> <div style="background-color ...

  6. java初学者(新手)应该如何选择学习教材与网站

    作者:天天向上 1.学习教材选择推荐<JAVA核心技术>,想多看点代码多练习可以找<java开发实战经典>&amp;amp;lt;img src="https ...

  7. [UWP]创建一个进度按钮

    1. 前言 最近想要一个进度按钮. 传统上UWP上处理进度可以这样实现,首先是XAML,包括一个ProgressBar和一个按钮: <StackPanel Orientation="H ...

  8. CentOS 引导 Win10 启动项

    因为无聊,所以想尝试一下双系统,所以在win10的基础之上,装了一个Linux系统,之前装过Ubuntu,几乎都是自动完成的无任何压力.但是想着Ubuntu好像更新换代有点快,所以换了个能用比较久的C ...

  9. 利用python多线程实现多个客户端与单个服务端的远程ssh

    本次实验设计两个方面的代码,第一个是客户端,代码如下: import os from socket import * c = socket(AF_INET,SOCK_STREAM) c.connect ...

  10. 宝藏(树形DP)

      这道题目是十分考验思维的,n^2应该还是比较好想的,主要是如何转移根的问题.转移根,在我看来应该是树形dp最难的一部分了, 一般学会如何转移根,也就差不多考验通吃树形dp了. 下面转一转大佬链接: ...