头文件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();
itsString = '\0';
itsLen = ;
} Hi_String::Hi_String(const Hi_String & mystring)
{
itsLen= mystring.GetLen();
itsString = new char(itsLen+);
for(int i=;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+);
for(int i=;i<itsLen;++i)
{
itsString[i]=mystring[i];
}
itsString[itsLen]='\0';
} Hi_String::Hi_String(int Len)
{
itsString = new char(Len+);
itsLen = Len;
for(int i=;i<itsLen+;++i)
{
itsString[i]='\0';
}
} Hi_String::~Hi_String()
{
//注意析构字符数组的方式
delete [] itsString;
itsLen=;
} Hi_String& Hi_String::operator=(const Hi_String& mystring)
{
if(this == &mystring)
{
return *this;
} delete [] itsString;
itsLen = mystring.GetLen();
itsString = new char(itsLen+);
for(int i=;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=;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=;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-];
else
return itsString[offset];
} char& Hi_String::operator[](int offset)
{
if(offset>itsLen)
return itsString[itsLen-];
else
return itsString[offset];
} int main()
{
Hi_String ztao("ztao");
cout<<ztao.GetString()<<endl;
return ;
}

自定义的string类的更多相关文章

  1. C++基础 (5) 第五天 重载new delete () 只能操作符 自定义string类

    1 昨日回顾 1.static 对整个类共享 可以直接用 类::方法 调用 如果是私有的 可以提供一个静态的访问静态成员的方法 2 自定义的数组类-重载操作符[] 3 重载new和delete 4 重 ...

  2. 自定义String类,并且实现在STL容器中添加自定义的类型

    13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 1 ...

  3. java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)

    代码部分: public static void main(String[] args) { testInt(); testString(); testArray(); testX(); } publ ...

  4. 自定义string类

    #include <iostream> #include <cstring> using namespace std; class String; class Data{ // ...

  5. Android 自定义Activity基类与TitleBar

    我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...

  6. hadoop编程小技巧(5)---自定义输入文件格式类InputFormat

    Hadoop代码测试环境:Hadoop2.4 应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForma ...

  7. Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  8. Java中String类的format方法使用总结

    可参考: http://www.cnblogs.com/fsjohnhuang/p/4094777.html http://kgd1120.iteye.com/blog/1293633 String类 ...

  9. String类源码分析(JDK1.7)

    以下学习根据JDK1.7String类源代码做注释 public final class String implements java.io.Serializable, Comparable<S ...

随机推荐

  1. Oracle的sql语句中case关键字的用法 & 单双引号的使用

    关于sql中单引号和双引号的使用,来一点说明: 1. 查询列的别名如果含有汉字或者特殊字符(如以'_'开头),需要用双引号引起来.而且只能用双引号,单引号是不可以的. 2. 如果想让某列返回固定的值, ...

  2. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  3. [Node.js] Using ES6 and beyond with Node.js

    If you're used to using all the latest ES6+ hotness on the front end via Babel, working in Node.js c ...

  4. Picasso – Android系统的图片下载和缓存类库

    Picasso – Android系统的图片下载和缓存类库 Picasso 是Square开源的一个用于Android系统下载和缓存图片的项目.该项目和其他一些下载图片项目的主要区别之一是:使用4.0 ...

  5. Gson源码分析之Json结构抽象和注解使用

    github上的博客地址: http://chuyun923.github.io/blog/2015/01/06/gsonyuan-ma-fen-xi/ XML和Json作为最常用的两种网络传输格式而 ...

  6. 使用VTemplate模板引擎动态生成订单流程图

    1.VTemplate模板引擎的简介 VTemplate模板引擎也简称为VT,是基于.NET的模板引擎,它允许任何人使用简单的类似HTML语法的模板语言来引用.NET里定义的对象.当VTemplate ...

  7. LinkedList : 双向链表与实现

    所谓双向链表: (由此图可见老夫深厚的画功) 链表,就是由一个一个的节点连接组成. 在这里,每一个节点都是由三部分组成:上一个节点.当前节点的元素.下一个节点 当链表中只有一个节点的时候,这个节点指向 ...

  8. 微软HoloLens虚拟现实可以开发了。

    1.microsoft-hololens-now-available-to-developers 2.http://www.microsoft.com/microsoft-hololens/en-us ...

  9. 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案

    作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一 ...

  10. 全世界最详细的图形化VMware中linux环境下oracle安装(二)【weber出品必属精品】

    <ORACLE 10.2.05版本的升级补丁安装> 首先我们解压 $ unzip p8202632_10205_LINUX.zip 解压后我们会发现多出了个文件夹,他是:Disk1,进入D ...