头文件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. Install and configure sql server 2008 express

    http://www.symantec.com/connect/articles/install-and-configure-sql-server-2008-express

  2. python RabbitMQ队列使用(入门篇)

    ---恢复内容开始--- python RabbitMQ队列使用 关于python的queue介绍 关于python的队列,内置的有两种,一种是线程queue,另一种是进程queue,但是这两种que ...

  3. ASP.NET 实现PDF文件下载

    本文介绍了一种在ASP.NET中下载文件的方法. 方法一:可能是最简单的.最短的方式: Response.ContentType = "application/pdf"; Resp ...

  4. Vagrant入门[转]

    Vagrant是一个简单易用的部署工具,用英文说应该是orchestration tool.它能帮助开发人员迅速的构建一个开发环境,帮助测试人员构建测试环境. Vagrant的基本工作原理大致如下: ...

  5. linq读书笔记1-linq 初步

    至于linq是什么之类的已经有过太多的文章介绍,亦不清楚的胡朋友可以自己搜索一下便可以得到大量的答案 为了体验linq究竟能带给我们什么体验,我们直接从代码入手: string[] words = n ...

  6. SVN的初步使用方法

    1.需要公司提供SVN账号密码 2.cd 输入本地存储路径 3.输入服务器地址 --uesr= (账号名) --password=(账号密码) 4.本地路径会自动创建文件 5.经理会初始化项目 5.1 ...

  7. 学习unity的第一个小游戏(Roll the ball)的笔记

    1.摄像机的跟随运动,逻辑就是保持摄像机跟主角的距离不变(Undate()函数). offset=trandform.position-player.position. Undate() { tran ...

  8. linux install zh_CN(ubuntu)

    cd /usr/share/locales sudo ./install-language-pack zh_CN

  9. zeromq源码分析笔记之无锁队列ypipe_t(3)

    在上一篇中说到了mailbox_t的底层实际上使用了管道ypipe_t来存储命令.而ypipe_t实质上是一个无锁队列,其底层使用了yqueue_t队列,ypipe_t是对yueue_t的再包装,所以 ...

  10. c++11-bind的用法

    bind函数 在c++11之前,要绑定某个函数.函数对象或者成员函数的不同参数值需要用到不同的转换器,如bind1st.bind2nd.fun_ptr.mem_fun和mem_fun_ref等.在c+ ...