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

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

首先在解答这道题目之前,先要作一些说明:

1.任何类都是默认的重载赋值操作符。

2.类一旦被声明并且编译后就会为该类的实例分配内存。

3.如果类的成员变量没有在堆(动态分配)中分配内存,那么无需重载赋值操作符也可。因为这样的赋值只

是为每个成员变量赋值而已。

比如:对象A有成员变量int a1

 A a;
a.a1=;
A b;
b.a1=;
a=b;

当执行到a=b;这一步的时候其实即使我们没有重载赋值操作符,也会调用类A的对象a的默认赋值函数

 void A::operate = (A b)
{
this.a1=b.b1;
}

至此,对象a中的a1成功赋值为b1即2,没有问题的。

接下来我们要考虑另外一种情况

假如类A中有一个指针成员变量int *ptr;该ptr在构造函数中new了一块内存。

那么我们重新考虑类A的两个对象a,b

对象a,b分别有一个指针ptr,并且该指针在构造函数中分别new了一块内存我们分别以mema和memb表示。

在a的ptr中new的内存mema中的值我们设为1,在b的ptr中new的内存memb中的值我们设为2.

 A a;/在构造函数new ptr(mema)
A b;/在构造函数new ptr(memb)
a=b;

当我们执行到a=b这一步的时候,我们如果没有重载赋值操作符。那么

 void A::operate = (A b)
{
this.ptr=b.ptr; }

乍看好像也没什么错,是的 this.ptr=b.ptr这句是将对象b.ptr的所指向的内推地址memb赋值给了a.ptr所

指向的对象。好了问题来了,那么a.ptr所指向的那块内推是分配在堆中的也就所如果我们没有主动释放它

是不会自动释放的。然而a.ptr已经指向了memb,这样很明显对象a出现了内存泄露。当然问题还不止于

此,现在a.ptr和b.ptr都同时指向了memb.那么如果当对象a或者b结束后必然会释放掉memb,比如说a先结束

释放memb,那么b.ptr是不是就成了野指针了呢,如果b先结束,那么a.ptr便成为了野指针,同时对象a还出现了内存泄露.

那么你会问为什么之前直接赋值就可以而这里直接赋值就不行呢,这就涉及一个内存管理的问题,分配在堆的

内存是需要我们用户自己释放的,而分配在栈的内存是由程序自己管理,程序结束后会自动释放。

现在明白重载赋值操作符的场景了吧,

那么还有几点需要说明:

1.赋值操作符重载通常形参我们是引用,引用可以减少直接传值带来的构造开销.

2.赋值操作符重载通常形参是常量,这是为了防止在赋值过程中操作符右值被修改。

3.如果为了连续赋值应该把返回值类型声明为该类型的引用,否则函数的返回值为void,不能连续赋值。

4.当然为我们还应该考虑传入的对象是否和被赋值对象是否相等。

综合以上因素,这道题结果如下:

 CMyString& CMyString::operator = (const CMyString& str)
{
if(this==&str)
return *this; delete []m_pData;
m_pData=NULL; m_pData=new char[strlen(str.m_pData)+]; strcpy(m_pData,str.m_pData); return *this;
}

剑指offer-面试题1:赋值运算符函数的更多相关文章

  1. 剑指offer第二版-1.赋值运算符函数

    面试题1:赋值运算符函数题目要求:为自定义类添加赋值运算符函数,考察一些细节点的书写.

  2. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  3. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

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

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

  5. 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历

    二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...

  6. 【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

    题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2 ...

  7. 【剑指Offer面试题】九度OJ1384:二维数组中的查找

    下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> ...

  8. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  9. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  10. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

随机推荐

  1. 杭电2059(dp)

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. 虚函数virtual

    简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同 ...

  3. AsyncTask实现下载图片

    实现效果: /*采用异步任务  AsyncTask<String,Integer, byte[]>  * 参数一代表 执行异步任务时传递的参数的类型  * 参数二 如果不采用进度,则填Vo ...

  4. eclipse配置maven + 创建maven项目

        登录|注册     努力+坚持,而且还很年轻   目录(?)[+] 在现实的企业中,以低成本.高效率.高质量的完成项目,不仅仅需要技术大牛,企业更加需要管理大牛,管理者只懂技术是远远不够的.当 ...

  5. android jni ——Field & Method --> Accessing Field

    现在我们知道了怎样使用native code访问简单的数据类型和引用参考类型(string,array),下面我们来介绍怎样让jni代码去访问java中的成员变量和成员函数,然后可以再jni中回调ja ...

  6. Android FragmentActivity onActivityResult冲突问题

    场景:假设fragment的填充数据是ListView,ListView中的每一项都有button,点击每一项的button跳转到B界面.在B界面处理完业务需返回fragment中更新数据. 解决方式 ...

  7. Android应用程序进程启动过程的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址: http://blog.csdn.net/luoshengyang/article/details/6747696 Android 应用程序框架层创 ...

  8. Javascript进阶篇——浏览器对象—JavaScript计时器

    ---恢复内容开始--- JavaScript 计时器在JavaScript中,我们可以在设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行.计时器类型:一次性计时器:仅在指定的延迟时间之后触 ...

  9. web.cofing(新手必看)

    花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点.所以这里只介绍一些比较常用的节点. <? ...

  10. MVC View基础(转)

    View主要用于呈现数据.由于Controller和相关的Service已经处理完业务逻辑并将结果打包成model实体,View只需要怎么去获得model并将其转为Html 1选择需要渲染的视图 在上 ...