剑指Offer - 面试题1:赋值运算符函数

简介: 剑指Offer - 面试题1:赋值运算符函数

题目

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

class CMyString
{
public:
  CMyString(char* pData = nullptr);
  CMyString(const CMyString& str);
  ~CMyString(void);
private:
  char* m_pData;
};


分析

该代码并不难,但是有几个值得注意的点。

1、返回值声明为当前类型的引用,且返回自身的引用(*this)。目的是为了可以连续赋值.如:

CMyString str1,str2,str3;

str1 = str2 = str3;


2、传入参数的类型是否是常量引用。引用可以避免调用一次复制构造函数,能提高代码的效率,常量可以避免在赋值过程中改变传入的值。


3、是否释放实例自身已有的内存。如果不释放,然后赋值就会导致之前申请的那块内存彻底找不到了,造成内存泄漏。


4、(忽略的点)判断传入的参数和当前的实例(*this)是否为同一个实例(虽然这种情况少)。如果是就直接返回当前实例(*this)。如果我们不加以判断,先释放当前实例的内存,那么传入的参数指向的内存也就被释放了(因为俩者指向同一块内存),就找不到之前的值了。


代码如下

 CMyString& CMyString::operator=(const CMyString& str)
{
  //判断是否指向同一块地址
  if (this == &str)
  {
    return *this;
  }
  //释放自身
  delete[] m_pData;
  m_pData;
  //赋值
  int len = strlen(str.m_pData);
  m_pData = new char[strlen(str.m_pData) + 1];
  strcpy(m_pData, str.m_pData);
  //返回引用类型
  return *this;
}


思考:

这个代码还有一个问题,如果申请空间失败会怎么样?

内存不足导致new char抛出异常。先删除自身的值,然后新的空间开辟失败,得不到新的值。相当于我让你帮我办事情,事情没办好就算了,还把我给出卖了。


解决方法:我们可以通过一个临时对象来保存当前实例m_pData的地址,然后进行赋值,然后释放临时对象。

CMyString& CMyString::operator=(const CMyString& str)
{
  //判断是否指向同一块地址
  if (this != &str)
  {//交换str和strTemp的m_pData值
    CMyString strTemp(str);     //通过拷贝构造初始化strTemp
    char* pTemp = strTemp.m_pData;  //创建指针保存传入实例值的地址
    strTemp.m_pData = m_pData;    //将当前实例值的地址给到strTemp
  }//出了strTemp的作用后,自动调用strTemp的析构函数。
  return *this;
}

总结

越是简单的题,越要注意细节。考察的一些细微的处理。

本章完

目录
相关文章
|
2月前
【一刷《剑指Offer》】面试题 23:从上往下打印二叉树
【一刷《剑指Offer》】面试题 23:从上往下打印二叉树
|
2月前
【一刷《剑指Offer》】面试题 22:栈的压入、弹出系列
【一刷《剑指Offer》】面试题 22:栈的压入、弹出系列
|
2月前
|
算法
【一刷《剑指Offer》】面试题 21:包含 main 函数的栈
【一刷《剑指Offer》】面试题 21:包含 main 函数的栈
|
2月前
【一刷《剑指Offer》】面试题 20:顺时针打印矩阵
【一刷《剑指Offer》】面试题 20:顺时针打印矩阵
|
2月前
【一刷《剑指Offer》】面试题 19:二叉树的镜像
【一刷《剑指Offer》】面试题 19:二叉树的镜像
|
2月前
【一刷《剑指Offer》】面试题 18:树的子结构
【一刷《剑指Offer》】面试题 18:树的子结构
|
2月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
2月前
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表
|
2月前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
|
2月前
|
C++
【一刷《剑指Offer》】面试题 14:调整数组顺序使奇数位于偶数前面
【一刷《剑指Offer》】面试题 14:调整数组顺序使奇数位于偶数前面