赋值运算符函数__from <剑指Offer>
时间:2022-05-03
本文章向大家介绍赋值运算符函数__from <剑指Offer>,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前段时间忙于项目,难得偷得几日闲,为即将到来的就业季做准备。在面试时,应聘者要注意多和考官交流,只有具备良好的沟通能力,才能充分了解面试官的需求,从而有针对性地选择算法解决问题。
题目来源于《剑指Offer》,自己在原有基础上稍作批注和修改。
问题:为类型添加赋值运算符函数,可以把CMyString实例赋值给另一个实例、自身和连续赋值。
学习点:考虑问题充分,自己不会把赋值情况、内存泄漏考虑到这么细致。
#include<cstring>
#include<cstdio>
class CMyString
{
public:
CMyString(char * pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator=(const CMyString& str);
void Print();
private:
char* m_pData; //类比C风格字符串
};
CMyString::CMyString(char * pData)
{
if (pData==nullptr) //空指针
{
//创建空字符串
m_pData = new char[1];
m_pData[0] = ' ';
}
else
{
int length = strlen(pData);
m_pData = new char[length + 1];
//复制
/*
char * strcpy(char * destination, const char * source);
Copies the C string pointed by source into the array pointed by destination, including the terminating null character(and stopping at that point).
*/
strcpy(m_pData, pData);
}
}
CMyString::CMyString(const CMyString& str)
{
int length = strlen(str.m_pData); //Returns the length of the C string str. The length of a C string is determined by the terminating null - character
m_pData = new char[length + 1]; //new分配内存后,默认使用delete释放对象
strcpy(m_pData, str.m_pData);
}
CMyString::~CMyString(void)
{
delete[] m_pData;
}
//1. 返回值的类型声明为该类型的引用,程序结束前返回实例自身的引用(*this)
//2. 传入的参数的类型声明为常量引用
//3. 释放实例自身的内存
//4. 判断传入的参数和当前的实例是不是同一个实例
//5. 升级:考虑异常安全性的解法 先new再delete
CMyString& CMyString::operator=(const CMyString& str) //参考2
{
if (this != &str) //参考4
{
CMyString strTemp(str); //临时实例
//参考3
char* pTemp = strTemp.m_pData;
strTemp.m_pData= m_pData;
m_pData = pTemp;
}//调用strTemp的析构函数,释放其内存
//参考1
return *this;
}
//================= 测试代码 ==================
void CMyString::Print()
{
printf("%s", m_pData);
}
void Test1()
{
printf("Test1 begins:n");
char* text = "Hello world";
CMyString str1(text);
CMyString str2;
str2 = str1;
printf("The expected result is: %s.n", text);
printf("The actual result is: ");
str2.Print();
printf(".n");
}
// 赋值给自己
void Test2()
{
printf("Test2 begins:n");
char* text = "Hello world";
CMyString str1(text);
str1 = str1;
printf("The expected result is: %s.n", text);
printf("The actual result is: ");
str1.Print();
printf(".n");
}
// 连续赋值
void Test3()
{
printf("Test3 begins:n");
char* text = "Hello world";
CMyString str1(text);
CMyString str2, str3;
str3 = str2 = str1;
printf("The expected result is: %s.n", text);
printf("The actual result is: ");
str2.Print();
printf(".n");
printf("The expected result is: %s.n", text);
printf("The actual result is: ");
str3.Print();
printf(".n");
}
int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
getchar(); //等待输入
return 0;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- rk3399 wifi和eth0共存 调试
- 23条JavaScript初学者应知的最佳实践方法
- 黑板客爬虫闯关游戏
- Python自学成才之路 多进程开发
- Python自学成才之路 进程间通信
- android 功耗(1)---android 功耗分析方法和优化
- 为什么要写 tf.Graph().as_default()
- tf.get_variable_scope().reuse_variables() 的使用
- Tensorflow小技巧整理:
- Tensorflow学习笔记——Summary用法
- 神经网络优化(损失函数:自定义损失函数、交叉熵、softmax())
- C++ STL stack 用法
- 遍历string时 使用for(char& c : s) for(char c : s) 的区别
- vc dll静态函数导出
- 利用GDB调试 MSQL