(剑指Offer)面试题1:赋值运算符函数
题目:
如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString{
public:
CMyString(char* pData=NULL);
CMyString(const CMyString& str);
CMyString& operator=(const CMyString& str);
~CMyString(void);
private:
char *m_pdata;
};
思路:
赋值运算符函数,注意四点:
1、是否将返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用,即*this。只有返回一个引用,才可以允许连续赋值。
2、是否把传入参数的类型声明为常量引用。如果传入的参数不是引用而是实例,那么从形参到实参会调用一次复制构造函数,把参数声明为引用可以避免这样的无谓消耗,能提高代码的效率。同时,在赋值运算符函数中不会改变传入的实例的状态,因此应该为传入的引用参数加上const关键字。
3、是否释放实例自身已有的内存,如果忘记在分配新内存之前释放自身已有的空间,程序将出现内存泄露。
4、是否判断传入的参数和当前实例*this是不是同一个实例。如果是同一个,则不进行赋值操作,直接返回。
5、注意浅拷贝和深拷贝
更多考虑:异常安全性等。
代码:
#include <iostream>
#include <string.h> using namespace std; class CMyString{
public:
CMyString(const char* pData=NULL);
CMyString(const CMyString& str);
CMyString& operator=(const CMyString& str);
char* getData(){return this->m_pdata;};
~CMyString(void); private:
char *m_pdata;
}; /*
// shallow copy
CMyString::CMyString(char* pData){
m_pdata=pData;
} CMyString::CMyString(const CMyString& str){
*this=str;
}
*/ // deep copy
CMyString::CMyString(const char* str){
if(str==NULL){
m_pdata=new char[];
m_pdata[]='\0';
}
else{
m_pdata=new char[strlen(str)+];
strcpy(m_pdata,str);
}
} CMyString::CMyString(const CMyString &str){
m_pdata=new char[strlen(str.m_pdata)+];
strcpy(m_pdata,str.m_pdata);
} CMyString::~CMyString(){
delete[] m_pdata;
} 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;
} int main()
{
char a[]="hello";
CMyString str(a);
CMyString str1(str);
CMyString str2;
CMyString str3;
str3=str2=str;
cout << str.getData()<< endl;
cout << str1.getData()<< endl;
cout << str2.getData()<< endl;
cout << str3.getData()<< endl;
return ;
}
运行结果:
(剑指Offer)面试题1:赋值运算符函数的更多相关文章
- 剑指offer第二版-1.赋值运算符函数
面试题1:赋值运算符函数题目要求:为自定义类添加赋值运算符函数,考察一些细节点的书写.
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- 【剑指Offer面试题】 九度OJ1510:替换空格
c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...
- 【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面
题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2 ...
- 【剑指Offer面试题】九度OJ1384:二维数组中的查找
下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
随机推荐
- [BZOJ4820][SDOI2017]硬币游戏(高斯消元+KMP)
比较神的一道题,正解比较难以理解. 首先不难得出一个(nm)^3的算法,对所有串建AC自动机,将在每个点停止的概率作为未知数做高斯消元即可. 可以证明,AC自动机上所有不是模式串终止节点的点可以看成一 ...
- 周末 “CTO训练营”
今天下午去中关村参加了51cto高招 “CTO训练营” 第一期. 呃蛮有收获,聊技术发展,技术cto线路或对应发展,人事对应cto发展,投资人对应看法,51cto老总的看法. 呃,挺有意思,同样认识 ...
- CentOS下重新安装yum的方法
不小心误删除了VPS下面的yum,大家都知道yum在linux中是很重要的一个功能,软件的下载,系统的更新都要靠他.没有yum,系统基本处于半残废状态. yum的安装操作: 在SSH里面依次输入下面的 ...
- latch lock pin mutex
http://blog.163.com/liaoxiangui@126/blog/static/79569640201310773821804/ http://www.cnblogs.com/eric ...
- windows设置共享
设置共享: 添加用户 点击添加 设置权限 然后别人就可以查看了. 查看共享: 删除共享:
- MVC使用Gantt Chart实现甘特图,管理事情进度
借助"甘特图",可以直观地了解任务.活动.工作的进度.dhtmlxGantt是一个开源的Javacirpt库,能帮助我们快速创建"甘特图",本篇体验在MVC中的 ...
- [转载] 关于matlab GUI的一点心得
转载自 落落轻尘 [Fig文件方式,即使用菜单File->New->GUI来设计界面] 首先值得注意的是,在低版本matlab上制作的含GUI的m文件一般不能在高版本的matlab上面运行 ...
- iOS 5解决Could not instantiate class named NSLayoutConstraint问题
如果使用Xcode 4.5来新建项目,默认是支持AutoLayout的,但是AutoLayout是iOS 6的新特性,如果在iOS 5的simulator上运行程序,会出现Could not inst ...
- Android APP分享功能实现
[Android应用开发详解]第01期:第三方授权认证(一)实现第三方授权登录.分享以及获取用户资料 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折, ...
- 使用 NVM 管理不同的 Node.js 版本
欢迎您帮忙纠错, 一起帮助更多的人. 一起来学习交流React, QQ群:413381701 首发于:https://github.com/Kennytian/learning-react-nativ ...