模拟实现string其中的一些知识点

知识点列举

  1. 使用初始化列表的好处
  2. 拷贝构造的形参为&与值的区别
  3. 深拷贝与浅拷贝
  4. 使用&的好处
  5. 形参使用const引用的好处

使用初始化列表的好处

  1. 类成员中存在常量,如const int a,只能用初始化不能复制
  2. 类成员中存在引用,同样只能使用初始化不能赋值。类成员中存在引用,同样只能使用初始化不能赋值。
  3. 提高效率:对类类型来说,用初始化列表少了一次调用默认构造函数的过程,
//模拟实现stringclass String
{public://构造函数String(const char* str =“”)_size(strlen(str)), _str(new char[_size + 1]),_capacity( _size){strcpy(_str, str);}String(char* str, size_t size)_size(size),_capacity(size),_str(_str = new char[size + 1]){strncpy(_str, str, size);}

拷贝构造的形参为&与值的区别

  如果拷贝构造函数的形参用值,由于类中没有这个对象,就要调用拷贝构造函数来创建,以此类推,会造成无限递归循环

	//拷贝构造函数String(const String& s):_str(new char[s._capacity + 1]), _capacity(s._capacity), _size(s._size){strcpy(_str, s._str);}

深拷贝与浅拷贝

  1. 浅拷贝:也称位拷贝,编译器只是直接将指针的值全部拷贝过来,从而造成对个对象使用同一块空间,当一个对象将这块内存释放掉之后,另一些对象不知道该块空间已经还给了系统,以为还有效,依旧会对这块空间进行释放,在对这段内存进行释放操作的时候,一个内存空间被释放多次,发生了访问违规,导致程序崩溃。
  2. 深拷贝:为了解决浅拷贝的问题,深拷贝则不是直接将指针的值拷贝,是为指针_str开辟与str相同大小的内存空间,然后将str中的资源拷贝到_str中,这样虽然_str与str中的资源一样,但是使用的是两块独立的空间,所以delete时只释放这个对象自己的内存,不会出现访问违规。
	//赋值运算符String operator=(const String& s){if (this != &s){char* pStr = new char[s._capacity + 1];strcpy(pStr, _str);delete[] _str;_str = pStr;_capacity = s._capacity;_size = s._size;}return *this;}

形参使用&的好处

  形参是对象的引用,是通过传地址的方法传递参数的,对函数形参的改变就是对实参的改变,如果函数的形参是对象,则是通过传值的方法传递参数的,函数体内对形参的修改无法传到函数体外。

运算符重载部分

	//运算符重载部分bool operator<(const String& s){return !strcmp(_str, s._str);}bool operator<=(const String& s){if (strcmp(_str, s._str) == 1)return npos;return 1;}bool operator>(const String& s){return strcmp(_str, s._str);}bool operator>=(const String& s){if (strcmp(_str, s._str) != 1)return npos;return 1;}bool operator==(const String& s){return (strcmp(_str, s._str) == 0);}bool operator!=(const String& s){return (strcmp(_str, s._str) != 0);}friend ostream& operator<<(ostream& _cout, const String& s){_cout << s._str;return _cout;}friend istream& operator>>(istream& _cin, String& s){_cin >> s._str;return _cin;}

形参使用const的好处

  1. 当实参的类型比较大时,复制开销很大,引用会“避免复制”。
  2. “避免修改实参”,当使用引用时,如果调用者希望只使用实参并不修改实参,则const可以避免使用该引用修改实参。

string中部分接口的模拟实现

	//尾插void PushBack(char c){//CheckCapacity();_str[_size++] = c;_str[_size] = '\0';}//追加字符串void Append(const char* str)  {//判断对象中的剩余空间是否能够放下,放不下就开辟新空间int len = strlen(str);if (len > _capacity - _size)Reserve(2 * _capacity + len);strcat(_str, str);}char& operator[](size_t index){return _str[index];}const char& operator[](size_t index)const				//at与[]唯一不同的方式是前者越界会抛出异常,后者越界会崩溃,或者给随机值{return _str[index];}void Reserve(size_t newCapacity){if (_capacity <= newCapacity && _capacity != newCapacity){char* pStr = new char[newCapacity + 1];strcpy(pStr, _str);delete[] _str;_str = pStr;_capacity = newCapacity;}}void ReSize(size_t newSize, char c){if (newSize > _size){/*自己实现memset函数size_t size = _size;for (size_t i = 0; i < newSize; ++i){pStr[size++] = c;}delete[] _str;_str = pStr;*/Reserve(newSize);memset(_str + _size, c, newSize - _size);_str[newSize] = '\0';_capacity = newSize;}else if (newSize < _size){/*char* pStr = new char[newSize + 1];for (size_t i = 0; i < newSize; ++i){pStr[i] = _str[i];}delete[] _str;_str = pStr;*/memset(_str + newSize, '\0', 1);}_size = newSize;}int Size()const{return _size;}bool Empty()const{return (0 == _size);}int Find(char c, size_t pos = 0){for (size_t i = pos; i < _size; ++i){if (c == _str[i])return i;}return npos;}int rFind(char c){for (size_t i = _size - 1; i > 0; --i){if (c == _str[i])return i;}return npos;}//返回c格式的字符串const char* C_str()const			//返回c格式的字符串{return _str;}void Swap(String& s){swap(_str, s._str);swap(_size, s._size);swap(_capacity, s._capacity);}//从_str中返回从pos开始的size个字符的子字符串String StrSub(size_t pos, size_t size)   {//统计pos之后的所有字符数量int len = strlen(_str + pos);  //如果size超过了字符串实际长度,将size设置为pos之后的所有字符数量if (len < size)					size = len;//将_str中从pos位置开始的字符串传递size个回去return String(_str + pos, size);   }
	//析构函数~String(){if (_str){delete[] _str;_str = nullptr;_capacity = 0;_size = 0;}}private:char* _str;size_t _capacity;    //容量size_t _size;		 //有效字符的个数const static int npos;
};const int String::npos = -1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对抗性攻击轻松愚弄人工智能

对抗性攻击欺骗图像识别算法将3D打印乌龟认作步枪。来源&#xff1a;中国科学报摘要&#xff1a;在日前于瑞典斯德哥尔摩举行的国际机器学习会议上&#xff0c;一群研究人员描述了他们的3D打印乌龟。在日前于瑞典斯德哥尔摩举行的国际机器学习会议上&#xff0c;一群研究人员描…

浅谈C语言指针

什么是指针&#xff1f; 在计算机科学中&#xff0c;指针&#xff08;Pointer&#xff09;是编程语言中的一个对象&#xff0c;利用地址&#xff0c;它的值直接指向存在电脑存储器中的另一个地方的值。由于通过地址能找到所需的变量单位&#xff0c;可以说&#xff0c;地址指向…

转:EXCEL数据有效性设置

原文&#xff1a; http://hi.baidu.com/guosq/blog/item/88b37cd5bd367cfda144dfa0.html 先看图&#xff0c;有学生成绩表格&#xff0c;录入要求&#xff1a; 1. 成绩范围&#xff1a; 0 - 100&#xff1b; 2. 课程&#xff1a;只能是语文、数学、英语。 操作步骤&#xff1a;…

科学家绘制果蝇完整大脑高清图—可借此追踪任何两个神经元之间的连接

研究人员利用电子显微镜重建了果蝇的一系列神经元。来源&#xff1a;中国科学报科学家近日首次对黑腹果蝇的整个大脑进行了足够详细的成像&#xff0c;从而能探测每个神经元之间的单独连接&#xff0c;或者说突触。由此获得的图像数据库可帮助研究人员描绘支撑果蝇嗅闻、嗡嗡叫…

浅谈野指针

什么是野指针&#xff1f; 野指针并不是NULL指针&#xff0c;它是一个指向“垃圾”内存的指针&#xff0c;也就是说指向的地址是随机的&#xff0c;无法得知他的地址&#xff0c;操作系统自动对其进行初始化。   在计算机中&#xff0c;内存的分配由操作系统来管理&#xff0…

转: Linux下单网卡多vlan多虚拟机

#启动xen服务&#xff1a;xend start#列出虚拟机xm list#startxm create -c 虚拟机名#进入虚拟机xm console 虚拟机名#退出虚拟机ctrl]#关闭xm shutdown linux bridge实现了ieee 802.1d协议&#xff0c;这个实现&#xff0c;不能支持VLAN的功能。也就是说&#xff0c;这个实现&…

谈谈 Android 有多成功!欧盟这么罚它

选自 | Stratechery 作者 | Ben Thompson 编译 | 网易智能 参与 | 乐邦西方知名科技博主本汤普森&#xff08;Ben Thompson&#xff09;近日发布题为“欧盟VS Android”的文章&#xff0c;称谷歌固然有其违法的地方&#xff0c;但欧盟剥夺谷歌从其冒着高风险斥资数十亿美元开发…

VSS 错误链接

VSS服务器没有开&#xff08;或者链接不上、共享断开等情况&#xff09;&#xff0c;vs工程打开会提示你找不到VSS数据库&#xff0c;不小心点错了位置&#xff0c;结果VS链接不上VSS了&#xff0c;老是提示如下错误&#xff1a;VSS出项错误"Could not find the Visual So…

算法的五大特性

输入&#xff08;Input&#xff09; 算法可以有0个或多个输入&#xff0c;用来说明对象的初始值&#xff0c;其中的0的输入的意思是指算法自己已经定出了初始条件 输出&#xff08;Output&#xff09; 算法中必须有1或多个输出&#xff0c;因为输出是用来说明数据处理后的结果…

《纽约时报》评中国技术热潮:追捧“上菜机器人”等无意义的新奇产品

来源&#xff1a;纽约时报编译&#xff1a;全球技术地图上海的机器人魔力餐厅里的非人类服务员只能做到这一步。在食客们拍完照片和视频后&#xff0c;常规的服务员会上前进行服务。上海——能读人想法的耳机什么都没读出来。检测火灾的机器人已被宣布为安全隐患。机器人服务员…

运算符的优先级(Operator Precedence)总结(表)

概念 在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象&#xff1b;由于表达式有多种运算&#xff0c;不同的结合顺序可能得出不同结果甚至出现错误运算错误&#xff0c;因为当表达式中含多种运算时&#xff0c;必须按一定顺序进行结合&#xff…

队列 VS 堆栈

队列&#xff0c;又称为伫列&#xff08;英文queue&#xff09;&#xff0c;是先进先出&#xff08;FIFO, First-In-First-Out&#xff09;的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端&#xff08;称为rear&#xff09;进行插入操作&#xff0c;在前端&…

10家最具创新性的机器学习公司

来源&#xff1a;资本实验室摘要&#xff1a;机器学习是实现人工智能的一种方法&#xff0c;通过使用算法来解析数据、从中学习&#xff0c;然后对现实世界中的事件做出预测和判断。机器学习已经在各个行业得到广泛应用。近日《Analytics Insight》杂志评选出10家最具创新性的机…

静态数据成员与非静态数据成员

静态数据成员 用static来声明静态成员&#xff0c;它是类的一部分&#xff0c;有该类中的所有对象共同使用和维护&#xff0c;实现类中数据的共享&#xff08;静态区&#xff09;&#xff0c;要受private控制符影响。 非静态数据成员 类的每个实例都有一份拷贝(动态区)。 从内…

【译】微型ORM:PetaPoco

PetaPoco是一款适用于.Net 和Mono的微小、快速、单文件的微型ORM。 PetaPoco有以下特色&#xff1a; 微小&#xff0c;没有依赖项……单个的C#文件可以方便的添加到任何项目中。工作于严格的没有装饰的Poco类&#xff0c;和几乎全部加了特性的Poco类Insert/Delete/Update/Save …

李飞飞公布谷歌云TPU、AutoML、行业方案等多项进展,AI云计算成谷歌全新增长点...

来源&#xff1a;全球人工智能摘要&#xff1a;7 月 24 日-26 日&#xff0c;Google Cloud NEXT 18 大会在美国旧金山举行。7 月 24 日-26 日&#xff0c;Google Cloud NEXT 18 大会在美国旧金山举行&#xff0c;Google Cloud作为谷歌人工智能未来业务发展的基础性平台&#xf…

new/delete和malloc/free的区别

malloc/free和new/delete的区别 共同点 都是从堆上申请空间&#xff0c;并且需要用户手动释放。 不同点 1、malloc/free是函数&#xff0c;new/delete是操作符。 2、malloc需要用户区手动计算空间的大小&#xff0c;new直接再后面跟上空间的类型就好。 3、malloc返回的是…

this的用法添加样式给tr或者div

onmouseover与onmouseout事件处理器&#xff0c;分别对应为鼠标移上去和鼠标移开时触发。οnmοuseοver"this.classNamemenu_title2;" 是鼠标移到该单元格上去时应用的css样式为“.menu_title2”的样式 οnmοuseοut"this.classNamemenu_title;"是鼠标离…

C语言中生成可执行程序的过程

预处理&#xff1a;展开头文件/进行宏替换/去掉注释/条件编译 编译&#xff1a;检查语法是否有错误&#xff0c;生成汇编代码 汇编&#xff1a;将汇编代码转换可供机器识别的机器码 链接&#xff1a;将多个文件链接到一起生成可执行程序

Gartner:2018年十大科技趋势与其对IT和执行的影响

来源&#xff1a;云技术实践摘要&#xff1a;Gartner每年发布的十大战略科技趋势一直备受关注&#xff0c;但企业往往会将50%以上的预算花在基础设施和执行上。因此&#xff0c;了解十大科技趋势与其对IT和执行的影响十分必要。在本周的Gartner CIO峰会期间&#xff0c;Gartner…