问题:给出如下CMyString的声明,要求为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
};
当面试官要求应聘者定义一个复制运算符函数时,他会关注如下几点:
· 是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身(即*this)的引用?只有返回一个引用,才可以允许连续赋值。否则如果函数的返回值是void,假设有三个CMyString的对象,str1、str2和str3,在程序中语句str1=str2=str3将不能通过编译。
· 是否把传入的参数的类型声明为常量引用?如果传入的参数不是引用而是实例,那么从形参到实参会调用一次构造拷贝函数。把参数申明为引用可以避免这样的无谓消耗,能提高代码的效率。同时,我们在赋值运算符函数内是不会改变传入的实例的状态的,因此应该为传入的引用参数加上const关键字。
· 是否记得释放实例自身已有的内存?如果忘了在分配新内存之前释放自身已有的空间,将出现内存泄露。
· 是否判断传入的参数是不是和当前的实例(*this)是不是同一个实例?如果是同一个,则不进行赋值操作,直接返回。如果事先不判断,就进行赋值,那么在释放实例自身的内存的时候就会导致严重的问题:当*this和传入的参数是同一个实例时,那么一旦释放了自身的内存,传入的参数的内存也同时被释放了,因此再也找不到需要赋值的内容了。
当我们完整地考虑了上述几方面之后,我们可以写出如下的代码:
-
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) + 1];
-
strcpy(m_pData, str.m_pData);
-
-
return *this;
-
}
这是一般C++教材上提供的参考代码。如果是面试的是应届毕业生或者C++初级程序员,如果能全面地考虑到前面四点并完整地写出代码,面试官可能会让他通过这轮面试。但如果面试的是C++的高级程序员,面试官可能会提出更高的要求。
面试官会提醒我们在前面的函数中,显示地用delete释放自身m_pData的内存。同时我们也会在析构函数中用delete释放自身m_pData的内存。如果这个类型中添加新的指针成员变量,那么我们至少需要做两处修改,即同时在析构函数和这个赋值运算符函数里添加一条delete语句来释放新指针所指向的内存。一个改动需要在代码中多个地方修改代码,通常是有安全隐患的。通常我们会记得在析构函数里用delete释放指针成员变量,但未必每次都记得到赋值运算符函数来添加代码释放内存。
更好的办法在复制运算符函数中利用析构函数自动释放实例已有的内存。下面是这种思路的参考代码:
-
CMyString& CMyString::operator =(const CMyString
- 私立学校怎样面试?参考这些真题做好准备(天府第七中学面试题)
- 成都市2017小升初私立学校面试攻略和去年真题汇总
- 广州2017年公办小学面试
- 程序员面试题精选100题(63)-数组中三个只出现一次的数字
- 程序员面试题精选100题(62)-C/C++/C#面试题(5)
- 程序员面试题精选100题(61)-数对之差的最大值[算法]
- 程序员面试题精选100题(60)-判断二叉树是不是平衡[数据结构]
- 程序员面试题精选100题(59)-字符串的组合[算法]
本文已影响好书推荐最新文章推荐文章推荐栏目- 剧情介绍
- 早晚安心语
- 初中学习方法
- 教育资讯
- 办公表格
- 论文大全
- 理财知识
- 高中学习方法
- 简历下载
- 路由器
- 脑力开发
- 放假安排
- 作文大全
- 读后感
- 介绍信
- 感谢信
- 承诺书
- 节日大全
- Office教程
- 述职报告
- 标语
- 评语
- 合同范本
- 情书
- 请假条
- 责任书
- 请示
- 感言
- 方案大全
- 常用证明
- 口号
- 观后感
- 自我介绍
- 常识
- 弟子规
- 倡议书
- 日记
- 句子大全
- 大学
- 美文
- 职场顾问
- 唐诗
- 党团范文
- 语文
- 申请书
- 课件
- 历史故事
- 主题班会
- 调研报告
- 经典台词
- 说说大全
- 编程笔记
- 歇后语
- 自我评价
- 通知
- 应急预案
- 广告语
- 三字经
- 规章制度
- 邀请函
- 检讨书
- 委托书
- 加油稿
- 工作计划
- 实习范文
- 教案
- 工作总结
- 社保
- 政策法规
- 员工手册
- 讲话致辞
- 求职面试
- 辞职报告
- 自我鉴定
- 心得体会
- 社会实践报告
- 岗位职责
- 周公解梦
- 事迹材料