题目总结与代码归档:
【剑指offer-2】题目目录【C++版本】

GitHub代码路径: GitHub

面试题1

赋值运算符函数

题目: 如下为类型CMyString的声明,请为该类型添加赋值运算符函数。

class CMyString {public://构造函数CMyString(char *pData = nullptr);//拷贝构造函数CMyString(const CMyString &str);~CMyString(void);
private:char *m_pData;
};

考察点

1、是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(*this)。返回引用才允许连续赋值
2、把形参声明成该类型的常量引用,避免不必要的拷贝构造;
3、如果有必要,需要释放实例自身已经拥有的内存;
4、判断传入的参数和当前的实例(*this)是不是同一个实例(判断自赋值的情况);

进阶
判断会不会因为内存不足而导致new失败,解决办法有二 :
5、先new分配空间,然后再delete释放。只有在分配空间成功后才释放原有内容,即分配失败时我们可以保证原有内容保存下来;
6、先使用拷贝构造函数创建一个临时实例,然后交换临时实例和自身。临时实例在拷贝赋值函数之后自动析构了,且如果临时实例分配内存失败,也不会改变原有内容。

代码实现

方法一

// 方法一:
// 赋值运算符函数  考察点 1
CMyString& CMyString::operator = (const CMyString& str) // 考察点 2
{printf("这是拷贝赋值运算符!\n");if (this == &str)    // //检查自赋值的情况   考察点 4return *this;delete[]m_pData;  //  考察点 3m_pData = nullptr;m_pData = new char[strlen(str.m_pData) + 1];strcpy(m_pData, str.m_pData);return *this;    // 考察点 1
}

方法二

// 方法二:
CMyString &CMyString::operator=(const CMyString &str) {if (this != &str) {//调用拷贝构造函数CMyString strTmp(str);    // 进阶 6char *pTmp = strTmp.m_pData;strTmp.m_pData = m_pData;m_pData = pTmp;}// if 语句结束 strTmp 生命周期结束 自动调用 strTmp的析构函数return *this;
}

#include <cstring>
#include <iostream>
using namespace std;class CMyString
{public:CMyString(char* pData = nullptr);//拷贝构造函数CMyString(const CMyString& str);~CMyString(void);CMyString& operator = (const CMyString& str);char *getData();
private:char* m_pData;
};//构造函数 1   char *pData
CMyString::CMyString(char *pData)
{cout << "构造函数 1" << endl;if (pData == nullptr) // 参数检测{m_pData = new char[1];m_pData[0] = '\0';}else{//  strlen 计算字符串的长度,以结束符 0x00 为字符串结束(不包含)//可参见 https://www.cnblogs.com/BeyondAnyTime/archive/2012/05/28/2521460.htmlint length = strlen(pData); m_pData = new char[length + 1];   // new char[]strcpy(m_pData, pData);    //拷贝}
}//构造函数 2  const CMyString &str //参数使用const的引用
CMyString::CMyString(const CMyString &str)
{cout << "这是构造函数 2" << endl;int length = strlen(str.m_pData);m_pData = new char[length + 1];strcpy(m_pData, str.m_pData);
}
// 析构函数
CMyString::~CMyString()
{delete[] m_pData;  // delet[]
}char *CMyString::getData() {return m_pData;
} 方法一:
 赋值运算符函数  考察点 1
//CMyString& CMyString::operator = (const CMyString& str) // 考察点 2
//{//  cout << "这是拷贝赋值运算符!方法一" << endl;
//
//  if (this == &str) //
//      //检查自赋值的情况  考察点 4
//      return *this;
//
//  delete[]m_pData;    //  考察点 3
//  m_pData = nullptr;
//
//  m_pData = new char[strlen(str.m_pData) + 1];
//  strcpy(m_pData, str.m_pData);
//
//  return *this;   // 考察点 1
//}// 方法二:
CMyString &CMyString::operator=(const CMyString &str) {cout << "这是拷贝赋值运算符!方法二\n" << endl;if (this != &str) {//调用拷贝构造函数CMyString strTmp(str); // 进阶 6char *pTmp = strTmp.m_pData;strTmp.m_pData = m_pData;m_pData = pTmp;}// if 语句结束 strTmp 生命周期结束 自动调用 strTmp的析构函数return *this;
}int main()
{char *tmp = "hello world +++";CMyString myStr(tmp);  // cout << "myStr: " << myStr.getData() << endl;CMyString otherOne = myStr;cout << "otherOne: " << otherOne.getData() << endl;char *tmp2 = "hello world ---";CMyString myStr2(tmp2);cout << "myStr2: " << myStr2.getData() << endl;myStr2 = otherOne;cout << "myStr2 after operator \"=\": " << myStr2.getData() << endl;char* text = "Hello world";CMyString str1(text);CMyString str2, str3;str3 = str2 = str1;cout << "str3 = " << str3.getData()<< " str2 = " << str2.getData() << " str1 = " << str1.getData() << endl;system("pause");return 0;
}

参考资料:


GitHub链接:
https://github.com/lichangke
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习

剑指offer 面试题1:赋值运算符函数【C++版本】相关推荐

  1. 剑指offer——面试题21:包含min函数的栈

    剑指offer--面试题21:包含min函数的栈 Solution1: 辅助栈! 逻辑上要想清楚..但是用栈结构来实现栈,目的不知为何... class Solution { public:void ...

  2. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  3. [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

    [问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...

  4. 剑指offer面试题[64]-数据流中的中位数

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 分 ...

  5. 剑指offer面试题[30]-最小的k个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析思路:         这道题最简单的思路莫过于把输入的n个数排 ...

  6. (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数

    剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...

  7. 【有返回值的回溯法】剑指offer——面试题66:矩阵中的路径(回溯法)

    剑指offer--面试题66:矩阵中的路径(回溯法) Solution:1 典型的回溯算法及代码 此题是回溯法的典型例题,思路以及代码均是书中所讲.要具体实现很有参考价值,借鉴之! 现在把书中代码贴在 ...

  8. 【重点】剑指offer——面试题62:序列化二叉树

    剑指offer--面试题62:序列化二叉树 Solution1: 参考网址:https://www.nowcoder.com/profile/6475323/codeBookDetail?submis ...

  9. 剑指offer——面试题55:字符流中第一个不重复的字符

    剑指offer--面试题55:字符流中第一个不重复的字符 Solution1: 当年第一次做这个题的做法 对此题最大的感想是: 1)区分deque(双端队列)和queue(队列): 2)要熟悉queu ...

最新文章

  1. php jquery ajax输出数组吗,jquery – 从PHP返回数组时的Ajax Parse错误
  2. Java 并发编程:ThreadLocal 的使用及其源码实现
  3. 0基础学习ios开发笔记第二天
  4. 【深度学习】动漫风格迁移AnimeGANv2,发布线上运行Demo
  5. OA选型 寻找应用中的个性
  6. java服务器内存问题_java内存泄漏5种情况总结
  7. VMware安装CentOS之二——最小化安装CentOS
  8. 怎么在html使用百度商桥,电脑版网站如何添加爱番番(原:百度商桥)
  9. FTP服务器软件 虚拟目录,FTP服务器软件 虚拟目录
  10. Failed to access IIS metabase
  11. LINUX文件图标变化:有时右键菜单刷新可以,有时需要重启机器
  12. 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)【转】...
  13. 百度网盘有linux版本的,百度网盘Linux版发布,网友反馈“限速该有还是有”
  14. x4无法在此计算机上安装,错误写入注册表键_cdrx4安装提示不能将数值写入键_错误写入注册表键...
  15. GTP编译报错,需要增加IBUF
  16. ddos攻击服务器的几种方式
  17. Python Scrapy 爬取 前程无忧招聘网
  18. 2016流行这2种色彩!附优秀网页设计案例
  19. 华为 CISCO 交换机型号识别
  20. Tools —— 以管理员身份运行bat文件闪退

热门文章

  1. JAVA20w45a,我的世界Java版20w45a
  2. 分类算法如何绘制roc曲线,如何绘制knn模型的ROC曲线
  3. iFunk翼S,开学季不二之选
  4. 【金融客服AI新玩法】语言学运用、LSTM+DSSM算法、多模态情感交互
  5. 便宜又好的无线充电宝推荐,实惠的无线充电宝盘点
  6. Vue实现登录注册功能
  7. 也曾这样的。。。寂寞
  8. 蚂蚁集团联合Forrester发布服务网格白皮书 定义企业上云新路径
  9. 苹果7p怎么录屏_苹果7p三维触控怎么用
  10. JDK8辅助学习(七):IntStream