头文件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类相关推荐

  1. c 自定义实现string类 clear_有关类加载器的总结

    对于java开发来说,classLoader往往是容易被我们忽视的一个重要知识点.而classLoader对java的发展也有很大的影响.例如. 早期的applet应用,通过网络远程加载class文件 ...

  2. c 自定义实现string类 clear_基于scala2.13实现自定义的集合类 (下)

    前缀映射 作为第三个示例,您将学习如何将一种新型的可变地图集成到集合框架中. 这个想法是通过 "Patricia trie"实现以String作为键类型的可变映射. 实际上,术语P ...

  3. c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充

    在C++中,继承是一个对象自动获取其父对象的所有属性和行为的过程.通过继承,您可以重用,扩展或修改在其他类中定义的属性和行为.通过继承,可以实现函数重写以及多态. 在C++中,继承另一个类的成员的类称 ...

  4. C++ 自定义string类 重载相关运算符

    c++提供的string类 c++提供的string类可以做很多事情,它本质上是也是类,它的很多运算符都是通过重载进行实现的. 今天我们自己来简单来实现MyString类来模拟 string类能做得一 ...

  5. C++知识点42——下标运算符[]的重载及string类的实现

    一.下标运算符的重载 1.概念 如果一个类表示容器,那么要重载下标运算符[],下标运算符必须是成员函数.下表访问运算符通常要有一个const版本和一个非const版本.如果不定义const版本,那么c ...

  6. java 调用.net webservice axis2_java利用axis2调用.net写的webservice,传递自定义的实体类参数...

    利用axis2可以很方便的自动生成客户端代码,同时对复杂参数类型的传递也很方便,本文的服务端以.net开发,有一个自定义的实体类作为参数,客户端用java,简单介绍一下利用axis2的wsdl2jav ...

  7. C++使用StringPiece减少string类的拷贝

    C++使用StringPiece减少string类的拷贝 构造函数 操作 字符串比较 Traits 参考链接 使用c++ string类不可避免会带来很多不必要的拷贝,拷贝多了必然影响性能.因此在很多 ...

  8. ASP.Net string 类的扩展方法 [转]

    string 类的扩展方法列表(基本相同于 IEnumerable<T> 接口的成员列表): Aggregate<> //累加 All<> //是否都满足条件 An ...

  9. 深入剖析C++中的string类

    一,C语言的字符串 在C语言里,对字符串的处理一项都是一件比较痛苦的事情,因为通常在实现字符串的操作的时候都会用到最不容易驾驭的类型--指针. 比如下面这个例子: //example 1: char ...

  10. java自定义错误码类_如何编写和应用Java的自定义异常类

    11.7.1编写自定义异常类的模式 编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程.常用的编写自定义异常类的模式如下: public class Custo ...

最新文章

  1. 微信门店小程序怎样创建 门店小程序创建方法简介
  2. 【转载】解决Windows和Ubuntu时间不一致的问题
  3. Flink 分别读取kafka和mysql作为source
  4. python测试需要学什么_从手工测试到自动化测试需要学什么?
  5. 玩转android studio,玩转AndroidStudioIDE
  6. 前端开发 表单元素 0229
  7. Spring和Mybatis整合
  8. javascript Control flow(控制语句)
  9. Android ListView下拉刷新时卡的问题解决小技巧
  10. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)
  11. 基于LOAM框架的激光SLAM开源程序汇总
  12. pycharm windows 打开命令行终端terminal
  13. 爬取猎聘大数据岗位相关信息--Python
  14. Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制
  15. 从不确定性中寻找“确定性”——一位交管从业者对行业发展趋势的思考
  16. JavaScript不清不楚之Array.isArray
  17. 华为初面+综合面试(技术面)
  18. python统计一组数据中的概率_Python实现概率分布
  19. [COI2012] TRAMPOLIN
  20. 前端FormData详解

热门文章

  1. paip.转账功能设计流程
  2. 2018美国基金业年鉴-数据图表简版
  3. (转)趋势因子:利用投资期内所有信息的获利方法
  4. django使用mysql函数_请问django 可以操作mysql函数么?
  5. 【路径规划】基于matlab麻雀算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1582期】
  6. 【图像处理】基于matlab GUI打靶仿真系统【含Matlab源码 1043期】
  7. 【图像处理基础】基于matlab GUI图像局部放大【含Matlab源码 1016期】
  8. 【数字信号】基于matlab GUI DTMF双音多频电话拨号仿真【含Matlab源码 805期】
  9. java 三个点_Java Object定义三个点如何实现 Java Object定义三个点实现代码
  10. 怎么虚拟机做成服务器,虚拟机怎么做成服务器