(剑指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自动机上所有不是模式串终止节点的点可以看成一 ...
- BZOJ.3105.[CQOI2013]新Nim游戏(线性基 贪心 博弈论)
题目链接 如果后手想要胜利,那么在后手第一次取完石子后 可以使石子数异或和为0.那所有数异或和为0的线性基长啥样呢,不知道.. 往前想,后手可以取走某些石子使得剩下石子异或和为0,那不就是存在异或和为 ...
- java的反射机制(第三篇)
本文转载自:http://c.biancheng.net/cpp/html/1782.html Person p=new Person();这是什么?当然是实例化一个对象了.可是这种实例化对象的方法存 ...
- 从数组中查看某值是否存在,Arrays.binarySearch
Arrays.binarySearch为二分法查询,注意:需要排序 使用示例 Arrays.binarySearch(selectedRows, i) >= 0
- Codeforces Round #353 (Div. 2) D. Tree Construction 模拟
D. Tree Construction 题目连接: http://www.codeforces.com/contest/675/problem/D Description During the pr ...
- RTSP交互过程
步骤一: 发送:OPTIONS rtsp://127.0.0.1/172.30.31.225:8000:HIK-DS8000HC:0:1:admin:hs123456:av_stream RTSP/1 ...
- tomcat部署应用仅需ip和port访问
一.使用ip和port访问应用项目: 打开tomcat安装根目录,打开conf目录下server.xml,找到<Host>节点,并且在该节点下新增: <Context docBa ...
- 一个.net下的轻量级的Serverless 文档数据库LiteDB
今天发现了一个.net下的轻量级的Serverless 文档数据库LiteDB,感觉还不错 官方网站: http://www.litedb.org/ 项目主页: https://github.com/ ...
- 编写 Matlab mexFunction (C mex)
资料一 MATLAB的MEX文件编写和调试 1. MEX的编写格式 写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写. 编写MEX程序的编辑器可以使用M ...
- amfphp2.1.1的使用经过
这两天看了一个FLASH的教程,是arrowyong写的名为 <<ActionScript3.0从零基础学习类>>,这个教程好用,没有ActionScript编程经验的人,可以 ...