题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char *pData=NULL);//构造函数
CMyString(const CMyString& str);//拷贝构造函数
~CMyString();//析构函数
private:
char* m_pData;//数据域,字符指针
};

介绍重载赋值

  重载操作符是一些函数,其名字为关键字operator后紧跟需要重载的运算符,比如"operator="表示需要重载"="。像任何其他函数一样,操作符函数有一个返回值和一个形参表。形参表必须具有与该操作符操作数数目相同的形参,但是如果操作符是一个成员函数,它的第一个操作数隐式绑定到this指针,因此形参表中的参数会减少一个。因为赋值运算符必须是类的成员函数,所以this绑定到左操作数的指针。因此,赋值操作符只接受一个形参,且该形参是同一类型的对象,右操作数一般作为const引用传递,跟拷贝构造函数相同。

  赋值操作符的返回类型应该与内置类型赋值运算的返回类型相同,内置类型的赋值运算返回对左操作数的引用,因此赋值操作符也返回对同一类类型的引用。赋值必须返回对*this的引用,也就是左操作数的引用。一般而言,赋值操作符与复合赋值操作符应返回左操作数的引用。

  从上述基础知识我们知道了重载赋值操作符是一个类的成员函数,这个函数的返回类型是左操作数的引用,也就是*this,并且这个函数的参数是一个同类型的常引用变量。通过上述知识我们可以确定重载操作符函数为:

CMyString& operator=(const CMyString& str);//重载运算符

完整的代码实现如下:

View Code

存在的问题:

在上述代码中,我们首先释放实例自身已有内存,

//释放实例自身已有内存
delete[] m_pData;
m_pData=NULL;

然后再去开辟一块内存空间让m_pData指向这块内存空间,

//在删除自身内存以后在重新new一个长度为len+1的字符数组,类似拷贝构造函数
int len=strlen(str.m_pData);
m_pData=new char[len+1];

最后使用strcpy进行字符串赋值。

strcpy(m_pData,str.m_pData);

如果因为内存不足,在new char[len+1]阶段抛出异常,那么这时候因为已经释放了m_pData,导致m_pData指向一个空指针,这样可能会导致程序崩溃。有两种方案解决上述问题:

  • 先用new分配新内容,然后删除自己已有内容,最后进行赋值。
  • 创建一个临时实例,交换临时实例与当前实例的m_pData。代码如下:
View Code

这样的一个好处是在运行完if语句以后,因为除了strTemp的作用于,该实例会自动调用析构函数,把strTemp.m_pData所指向的内存释放掉,而此时strTemp.m_pData指向的是实例原先m_pData指向的内存,并没有释放当前指向的pTemp这一块内存。还有一点是通过构造函数为临时实例分配内存,如果在new char过程中抛出异常,并没有改变该实例m_pData所指向的内容,也没有释放内存,所以是异常安全性的。

本文转自xwdreamer博客园博客,原文链接文转:http://www.cnblogs.com/xwdreamer/archive/2012/05/14/2500632.html如需转载请自行联系原作者

面试题1:赋值运算符函数相关推荐

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

    题目总结与代码归档: [剑指offer-2]题目目录[C++版本] GitHub代码路径: GitHub 面试题1 赋值运算符函数 题目: 如下为类型CMyString的声明,请为该类型添加赋值运算符 ...

  2. [剑指offer]面试题1:赋值运算符函数

    面试题1:赋值运算符函数 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString {public:CMyString(char *pData = nu ...

  3. 《剑指offer》面试题1:赋值运算符函数 思考总结

    目录 题目 注意事项 相关知识点 异常安全性 bad_alloc 1.举例 2.异常处理 题目 注意事项 对于本题,正如书中所讲我们需要注意以下几点: 考虑返回值的类型:只有返回一个引用,才可以允许连 ...

  4. (剑指Offer)面试题1:赋值运算符函数

    题目: 如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{ public:     CMyString(char* pData=NULL);     ...

  5. 赋值运算符函数严谨性的几点思考

    1. 需求 class CMyString { public:CMyString(char* pData = NULL);CMyString(const CMyString& str);~CM ...

  6. 1. 赋值运算符函数

    https://github.com/zhulintao/CodingInterviewChinese2/blob/master/01_AssignmentOperator/AssignmentOpe ...

  7. 剑指offer (01):赋值运算符函数 (C++ 实现)

    1 题目 如下为类型 CMystring 的声明,请为该类型添加赋值运算符函数. class CMyString { public:CMyString(char* pData = nullptr);C ...

  8. 赋值运算符函数__from 剑指Offer

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

  9. 剑指offer笔记(三)菜鸟程序猿和高级攻城狮码赋值运算符函数的区别

    赋值运算符函数 小小的一个赋值运算符函数的写法完全可以区分出一个程序猿的功底 运算符函数是C++中经典的运算符重载函数 对于给定一个类: class my_string { public:my_str ...

最新文章

  1. FORM 中的颜色 Visual Attribute
  2. 【CCNP考试】2010-01-31-北京-845(PASS)
  3. Centos netperf安装
  4. python 多进程共享变量manager_python 进程间共享数据 multiprocessing 通信问题 — Manager...
  5. Linux日常命令使用记录
  6. Expected one result (or null) to be returned by selectOne(), but found: 7
  7. 交互式python解释器_从python脚本中调用python交互式解释器
  8. 编译生成的Apk安装到手机提示应用未安装,需给apk签名
  9. zedboard板子上呼吸灯的实现(第一版)仿真代码的实现
  10. 解决智慧树考试酷无法复制粘粘的问题
  11. 游戏设计学习笔记 —— 梦的开始
  12. php直播平台原理,php直播平台源码的直播带货平台有何技巧,别说没告诉你
  13. 吴伯凡-认知方法论-认知的两重性
  14. 关于app的几个核心功能的设计想法
  15. 中国人想在外国卖东西,这些经典网站不能错过
  16. 【报告分享】2021巨量引擎日化行业年度报告-巨量算数(附下载)
  17. html5把六张图片做成立方体,html5 3D旋转的图片立方体代码
  18. TI芯片TMS320DM642开发
  19. Open3D-GUI系列教程(三)界面布局
  20. 哔哩哔哩弹幕处理+情感倾向分析

热门文章

  1. Echo团队Alpha冲刺随笔 - 第六天
  2. 决策树1 -- ID3_C4.5算法
  3. App 更换应用图标
  4. UI框架-JQuery Smart / 淘宝JS库 KISSY UI
  5. javascript 经常会用到的东西
  6. pytorch-tensorflow版本选择-cuda8-cudnn5.1
  7. 简述无人驾驶感知功能
  8. Linux文件目录与路径
  9. linux任务计划不执行时间,Linux任务计划、周期性任务执行
  10. mysql开发是做什么_数据库开发是做什么东西的