剑指offer 面试题1:赋值运算符函数【C++版本】
题目总结与代码归档:
【剑指offer-2】题目目录【C++版本】
GitHub代码路径: GitHub
面试题1
赋值运算符函数
题目: 如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString {public://构造函数CMyString(char *pData = nullptr);//拷贝构造函数CMyString(const CMyString &str);~CMyString(void);
private:char *m_pData;
};
考察点
1、是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(*this)。返回引用才允许连续赋值
2、把形参声明成该类型的常量引用,避免不必要的拷贝构造;
3、如果有必要,需要释放实例自身已经拥有的内存;
4、判断传入的参数和当前的实例(*this)是不是同一个实例(判断自赋值的情况);
进阶
判断会不会因为内存不足而导致new失败,解决办法有二 :
5、先new分配空间,然后再delete释放。只有在分配空间成功后才释放原有内容,即分配失败时我们可以保证原有内容保存下来;
6、先使用拷贝构造函数创建一个临时实例,然后交换临时实例和自身。临时实例在拷贝赋值函数之后自动析构了,且如果临时实例分配内存失败,也不会改变原有内容。
代码实现
方法一
// 方法一:
// 赋值运算符函数 考察点 1
CMyString& CMyString::operator = (const CMyString& str) // 考察点 2
{printf("这是拷贝赋值运算符!\n");if (this == &str) // //检查自赋值的情况 考察点 4return *this;delete[]m_pData; // 考察点 3m_pData = nullptr;m_pData = new char[strlen(str.m_pData) + 1];strcpy(m_pData, str.m_pData);return *this; // 考察点 1
}
方法二
// 方法二:
CMyString &CMyString::operator=(const CMyString &str) {if (this != &str) {//调用拷贝构造函数CMyString strTmp(str); // 进阶 6char *pTmp = strTmp.m_pData;strTmp.m_pData = m_pData;m_pData = pTmp;}// if 语句结束 strTmp 生命周期结束 自动调用 strTmp的析构函数return *this;
}
全
#include <cstring>
#include <iostream>
using namespace std;class CMyString
{public:CMyString(char* pData = nullptr);//拷贝构造函数CMyString(const CMyString& str);~CMyString(void);CMyString& operator = (const CMyString& str);char *getData();
private:char* m_pData;
};//构造函数 1 char *pData
CMyString::CMyString(char *pData)
{cout << "构造函数 1" << endl;if (pData == nullptr) // 参数检测{m_pData = new char[1];m_pData[0] = '\0';}else{// strlen 计算字符串的长度,以结束符 0x00 为字符串结束(不包含)//可参见 https://www.cnblogs.com/BeyondAnyTime/archive/2012/05/28/2521460.htmlint length = strlen(pData); m_pData = new char[length + 1]; // new char[]strcpy(m_pData, pData); //拷贝}
}//构造函数 2 const CMyString &str //参数使用const的引用
CMyString::CMyString(const CMyString &str)
{cout << "这是构造函数 2" << endl;int length = strlen(str.m_pData);m_pData = new char[length + 1];strcpy(m_pData, str.m_pData);
}
// 析构函数
CMyString::~CMyString()
{delete[] m_pData; // delet[]
}char *CMyString::getData() {return m_pData;
} 方法一:
赋值运算符函数 考察点 1
//CMyString& CMyString::operator = (const CMyString& str) // 考察点 2
//{// cout << "这是拷贝赋值运算符!方法一" << endl;
//
// if (this == &str) //
// //检查自赋值的情况 考察点 4
// return *this;
//
// delete[]m_pData; // 考察点 3
// m_pData = nullptr;
//
// m_pData = new char[strlen(str.m_pData) + 1];
// strcpy(m_pData, str.m_pData);
//
// return *this; // 考察点 1
//}// 方法二:
CMyString &CMyString::operator=(const CMyString &str) {cout << "这是拷贝赋值运算符!方法二\n" << endl;if (this != &str) {//调用拷贝构造函数CMyString strTmp(str); // 进阶 6char *pTmp = strTmp.m_pData;strTmp.m_pData = m_pData;m_pData = pTmp;}// if 语句结束 strTmp 生命周期结束 自动调用 strTmp的析构函数return *this;
}int main()
{char *tmp = "hello world +++";CMyString myStr(tmp); // cout << "myStr: " << myStr.getData() << endl;CMyString otherOne = myStr;cout << "otherOne: " << otherOne.getData() << endl;char *tmp2 = "hello world ---";CMyString myStr2(tmp2);cout << "myStr2: " << myStr2.getData() << endl;myStr2 = otherOne;cout << "myStr2 after operator \"=\": " << myStr2.getData() << endl;char* text = "Hello world";CMyString str1(text);CMyString str2, str3;str3 = str2 = str1;cout << "str3 = " << str3.getData()<< " str2 = " << str2.getData() << " str1 = " << str1.getData() << endl;system("pause");return 0;
}
参考资料:
GitHub链接:
https://github.com/lichangke
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习
剑指offer 面试题1:赋值运算符函数【C++版本】相关推荐
- 剑指offer——面试题21:包含min函数的栈
剑指offer--面试题21:包含min函数的栈 Solution1: 辅助栈! 逻辑上要想清楚..但是用栈结构来实现栈,目的不知为何... class Solution { public:void ...
- 【剑指Offer面试题】 九度OJ1510:替换空格
c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...
- [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]
[问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...
- 剑指offer面试题[64]-数据流中的中位数
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 分 ...
- 剑指offer面试题[30]-最小的k个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析思路: 这道题最简单的思路莫过于把输入的n个数排 ...
- (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数
剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...
- 【有返回值的回溯法】剑指offer——面试题66:矩阵中的路径(回溯法)
剑指offer--面试题66:矩阵中的路径(回溯法) Solution:1 典型的回溯算法及代码 此题是回溯法的典型例题,思路以及代码均是书中所讲.要具体实现很有参考价值,借鉴之! 现在把书中代码贴在 ...
- 【重点】剑指offer——面试题62:序列化二叉树
剑指offer--面试题62:序列化二叉树 Solution1: 参考网址:https://www.nowcoder.com/profile/6475323/codeBookDetail?submis ...
- 剑指offer——面试题55:字符流中第一个不重复的字符
剑指offer--面试题55:字符流中第一个不重复的字符 Solution1: 当年第一次做这个题的做法 对此题最大的感想是: 1)区分deque(双端队列)和queue(队列): 2)要熟悉queu ...
最新文章
- php jquery ajax输出数组吗,jquery – 从PHP返回数组时的Ajax Parse错误
- Java 并发编程:ThreadLocal 的使用及其源码实现
- 0基础学习ios开发笔记第二天
- 【深度学习】动漫风格迁移AnimeGANv2,发布线上运行Demo
- OA选型 寻找应用中的个性
- java服务器内存问题_java内存泄漏5种情况总结
- VMware安装CentOS之二——最小化安装CentOS
- 怎么在html使用百度商桥,电脑版网站如何添加爱番番(原:百度商桥)
- FTP服务器软件 虚拟目录,FTP服务器软件 虚拟目录
- Failed to access IIS metabase
- LINUX文件图标变化:有时右键菜单刷新可以,有时需要重启机器
- 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)【转】...
- 百度网盘有linux版本的,百度网盘Linux版发布,网友反馈“限速该有还是有”
- x4无法在此计算机上安装,错误写入注册表键_cdrx4安装提示不能将数值写入键_错误写入注册表键...
- GTP编译报错,需要增加IBUF
- ddos攻击服务器的几种方式
- Python Scrapy 爬取 前程无忧招聘网
- 2016流行这2种色彩!附优秀网页设计案例
- 华为 CISCO 交换机型号识别
- Tools —— 以管理员身份运行bat文件闪退