题目总结与代码归档:
【剑指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. 设计费收费标准2002修订_酒店装修设计费收费标准,酒店装修设计效果图
  2. Java PECS
  3. LiveVideoStack线上分享第四季(十二):实时音视频抗丢包的实践
  4. PHP Mysql-创建数据表
  5. 如何评价一个开源项目——协作影响力
  6. android monitor不能查看/data目录
  7. 用户代码未处理EntityCommandExecutionmException报错解决方案
  8. C语言 strlen 函数 - C语言零基础入门教程
  9. python自动化测试脚本可以测php吗_python unittest实现api自动化测试_python
  10. 关于Axure RP
  11. 也谈大公司病3——治大国不是烹小鲜
  12. 测试是个艺术活儿:测试需求分工原则
  13. Linux系统的头文件和库文件搜索路径
  14. Myeclipse2014在线安装SVN插件
  15. QQ安装目录下各文件用途不完全揭密(转)
  16. 合同法律风险管理 被骗者刑事风险
  17. flink-sql所有语法详解-1.13
  18. python爬虫登录微博账号_python模拟登录新浪微博 python新浪微博爬虫
  19. 1038: 绝对值最大 C语言
  20. 探寻机器人创客教育中的趣味

热门文章

  1. 2.3 定点乘法运算
  2. 谷歌过去7年51次收购:多为全资收购(名单)
  3. 《大众创业做电商——淘宝与微店 开店 运营 推广 一册通》一一2.2 B2B电子商务模式...
  4. 节约用电小贴士_节约用水:洗个小澡
  5. 怎样才能算好的家居“无主灯”照明设计
  6. mysql建立学号与课程编号的索引_数据库mysql 四约束 三范式 六索引
  7. mysql to days 索引_高性能mysql优化二之索引篇
  8. 投资扩张不顺利,让京东深感乏力,下一步并购扩张?
  9. 有种!阿里家的开门红居然发了…… 1
  10. ZYNQ有两个CPU?(三)——SGI异步通信