自定义的string类
头文件Hi_String.h
#include<iostream> #include<string.h> using namespace std;class Hi_String { public:Hi_String();~Hi_String();Hi_String(const Hi_String& mystring);Hi_String(const char* const mystring);int GetLen() const {return itsLen;}const char* GetString() const {return itsString;}/* 对于等号可以这样理解 s1=s2相当于实例化对象s1调用函数等号; 而s2相当于函数等号的输入参数 所以operator=输入参数不可改变的const Hi_String& mystring; */ /* 关于重载符号函数的函数返回不是很明白; 声明时候用Hi_String&\Hi_String\void */Hi_String& operator=(const Hi_String& mystring);Hi_String operator+(const Hi_String& mystring);void operator+=(const Hi_String& mystring);char& operator[](int offset);char operator[](int offset) const;private:int itsLen;char* itsString;//为什么要加一个私有构造函数;意义何在Hi_String(int Len); /* 因为在operator+时,需要创建一定长度的Hi_String; 但是这个构造函数不想让用户用;只在自己的公有函数中调用 所以声明为私有构造函数 */};
源文件Hi_String.cpp
#include"Hi_String.h"Hi_String::Hi_String() {itsString = new char(1);itsString = '\0';itsLen = 0; }Hi_String::Hi_String(const Hi_String & mystring) {itsLen= mystring.GetLen();itsString = new char(itsLen+1);for(int i=0;i<itsLen;++i){itsString[i]=mystring[i];}itsString[itsLen]='\0'; }Hi_String::Hi_String(const char * const mystring) {itsLen = strlen(mystring);itsString = new char(itsLen+1);for(int i=0;i<itsLen;++i){itsString[i]=mystring[i];}itsString[itsLen]='\0'; }Hi_String::Hi_String(int Len) {itsString = new char(Len+1);itsLen = Len;for(int i=0;i<itsLen+1;++i){itsString[i]='\0';} }Hi_String::~Hi_String() { //注意析构字符数组的方式 delete [] itsString;itsLen=0; }Hi_String& Hi_String::operator=(const Hi_String& mystring) {if(this == &mystring){return *this;}delete [] itsString;itsLen = mystring.GetLen();itsString = new char(itsLen+1);for(int i=0;i<itsLen;++i){itsString[i]=mystring[i];}itsString[itsLen]='\0';return *this; }/* 注意在函数里创建字符数组;是在堆上创建的; 当函数返回时;会销毁创建的堆; 所以函数不返回在堆上创建的Hi_String的指针; 因为函数一但返回;堆销毁,指针无效; 这里返回的是Hi_String;是堆上创建数组的一份拷贝 */ Hi_String Hi_String::operator+(const Hi_String& mystring) {int totaolLen = itsLen + mystring.GetLen();Hi_String temp(totaolLen);for(int i=0;i<itsLen;++i){temp[i] = itsString[i];}for(int j=mystring.GetLen();j<totaolLen;j++){temp[j] = mystring[j];} //并没有给temp[totalLen]='\0' //是因为在temp(totaolLen)私有构造函数 //中已经给temp[totalLen]赋'\0'了return temp; }void Hi_String::operator+=(const Hi_String& mystring) {int totolLen = itsLen + mystring.GetLen();Hi_String temp(totolLen);for(int i=0;i<itsLen;++i){temp[i] = itsString[i];}for(int j=mystring.GetLen();j<totolLen;j++){temp[j] = mystring[j];} //注意函数返回;所以这里直接等于就可以了*this = temp[totolLen]; }char Hi_String::operator[](int offset) const {if(offset>itsLen)return itsString[itsLen-1];elsereturn itsString[offset]; }char& Hi_String::operator[](int offset) {if(offset>itsLen)return itsString[itsLen-1];elsereturn itsString[offset]; }int main() {Hi_String ztao("ztao");cout<<ztao.GetString()<<endl;return 0; }
转载于:https://www.cnblogs.com/ztteng/p/3251401.html
自定义的string类相关推荐
- c 自定义实现string类 clear_有关类加载器的总结
对于java开发来说,classLoader往往是容易被我们忽视的一个重要知识点.而classLoader对java的发展也有很大的影响.例如. 早期的applet应用,通过网络远程加载class文件 ...
- c 自定义实现string类 clear_基于scala2.13实现自定义的集合类 (下)
前缀映射 作为第三个示例,您将学习如何将一种新型的可变地图集成到集合框架中. 这个想法是通过 "Patricia trie"实现以String作为键类型的可变映射. 实际上,术语P ...
- c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充
在C++中,继承是一个对象自动获取其父对象的所有属性和行为的过程.通过继承,您可以重用,扩展或修改在其他类中定义的属性和行为.通过继承,可以实现函数重写以及多态. 在C++中,继承另一个类的成员的类称 ...
- C++ 自定义string类 重载相关运算符
c++提供的string类 c++提供的string类可以做很多事情,它本质上是也是类,它的很多运算符都是通过重载进行实现的. 今天我们自己来简单来实现MyString类来模拟 string类能做得一 ...
- C++知识点42——下标运算符[]的重载及string类的实现
一.下标运算符的重载 1.概念 如果一个类表示容器,那么要重载下标运算符[],下标运算符必须是成员函数.下表访问运算符通常要有一个const版本和一个非const版本.如果不定义const版本,那么c ...
- java 调用.net webservice axis2_java利用axis2调用.net写的webservice,传递自定义的实体类参数...
利用axis2可以很方便的自动生成客户端代码,同时对复杂参数类型的传递也很方便,本文的服务端以.net开发,有一个自定义的实体类作为参数,客户端用java,简单介绍一下利用axis2的wsdl2jav ...
- C++使用StringPiece减少string类的拷贝
C++使用StringPiece减少string类的拷贝 构造函数 操作 字符串比较 Traits 参考链接 使用c++ string类不可避免会带来很多不必要的拷贝,拷贝多了必然影响性能.因此在很多 ...
- ASP.Net string 类的扩展方法 [转]
string 类的扩展方法列表(基本相同于 IEnumerable<T> 接口的成员列表): Aggregate<> //累加 All<> //是否都满足条件 An ...
- 深入剖析C++中的string类
一,C语言的字符串 在C语言里,对字符串的处理一项都是一件比较痛苦的事情,因为通常在实现字符串的操作的时候都会用到最不容易驾驭的类型--指针. 比如下面这个例子: //example 1: char ...
- java自定义错误码类_如何编写和应用Java的自定义异常类
11.7.1编写自定义异常类的模式 编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程.常用的编写自定义异常类的模式如下: public class Custo ...
最新文章
- 微信门店小程序怎样创建 门店小程序创建方法简介
- 【转载】解决Windows和Ubuntu时间不一致的问题
- Flink 分别读取kafka和mysql作为source
- python测试需要学什么_从手工测试到自动化测试需要学什么?
- 玩转android studio,玩转AndroidStudioIDE
- 前端开发 表单元素 0229
- Spring和Mybatis整合
- javascript Control flow(控制语句)
- Android ListView下拉刷新时卡的问题解决小技巧
- Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)
- 基于LOAM框架的激光SLAM开源程序汇总
- pycharm windows 打开命令行终端terminal
- 爬取猎聘大数据岗位相关信息--Python
- Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制
- 从不确定性中寻找“确定性”——一位交管从业者对行业发展趋势的思考
- JavaScript不清不楚之Array.isArray
- 华为初面+综合面试(技术面)
- python统计一组数据中的概率_Python实现概率分布
- [COI2012] TRAMPOLIN
- 前端FormData详解
热门文章
- paip.转账功能设计流程
- 2018美国基金业年鉴-数据图表简版
- (转)趋势因子:利用投资期内所有信息的获利方法
- django使用mysql函数_请问django 可以操作mysql函数么?
- 【路径规划】基于matlab麻雀算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1582期】
- 【图像处理】基于matlab GUI打靶仿真系统【含Matlab源码 1043期】
- 【图像处理基础】基于matlab GUI图像局部放大【含Matlab源码 1016期】
- 【数字信号】基于matlab GUI DTMF双音多频电话拨号仿真【含Matlab源码 805期】
- java 三个点_Java Object定义三个点如何实现 Java Object定义三个点实现代码
- 怎么虚拟机做成服务器,虚拟机怎么做成服务器