头文件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. NLP的神经网络训练的新模式
  3. 【已解决】github中git push origin master出错:error: failed to push some refs to(亲测)
  4. php get_token_all函数,pimcore getObjectByToken函数PHP对象注入漏洞
  5. 安装的mysql密码忘了_mysql8安装成功后忘记密码
  6. CSS 显示风格 appearance属性
  7. Android 系统(171)---OrmLite数据库框架,Picasso框架,Okio框架,OKHttp框架
  8. 震惊!雷军表示要出千元5G手机!
  9. jquery学习笔记(-)
  10. 邮件服务器pop110什么意思,pop pop3区别_25和110端口_imap和pop怎么设置
  11. Transformers in NLP (一):图说transformer结构
  12. 基于核的黎曼编码和字典学习
  13. tensorflow中axis理解非常重要
  14. 一点真心话希望77能好好翻译。。
  15. UIView 绘制渲染机制
  16. 小白系列之通俗易懂的Hadoop
  17. Python教程变量与打印
  18. 归档文件保存路径设置
  19. 通用Mapper条件查询后并分页
  20. Ubuntu下录制并制作Gif图片

热门文章

  1. paip.svn 导入项目到SVN库
  2. Julia : 如何利用julia获取Joinquant web api的数据?
  3. 高盛的合伙人是如何选出来的?
  4. 蚂蚁财富号:大、小型基金公司的电商业务对比
  5. Redis: 为行情数据库设计键值
  6. 阿里云存储负责人吴结生:我经历的三个重大决策
  7. 云上的消费你真的算清楚了?
  8. 春节面对亲友盘问:有对象了吗?月薪5万码农这样回答
  9. 【电路仿真】基于matlab BP神经网络三相逆变器故障诊断【含Matlab源码 1655期】
  10. 【机械仿真】基于matlab GUI 汽车悬架(钢板弹簧+减震器)设计【含Matlab源码 1631期】