头文件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. python mysql curros.executemany 批量添加

    #添加的表结构字段分辨是(id,title,summary,visits,accountName,grabTime) #其中id,是int自增主键,在添加操作的时候,不需要对id进行操作 conn = ...

  2. Win32/MFC的基本概念

    一.MFC的基本概念 单文档.多文档和对话框框架的区别 MFC中的类继承图的基本框架 CView类与CDocument的关系 Onpaint()和Ondraw()的关系 hdc-cdc区别联系 RUN ...

  3. C++内存泄露检測原理

    转自:http://hi.baidu.com/jasonlyy/item/9ca0cecf2c8f113a99b4981c 本文针对 linux 下的 C++ 程序的内存泄漏的检測方法及事实上现进行探 ...

  4. Andriod Studio科学文章——4.常见问题解答有关编译

    1.android未安装支持库 只有编译,下面的例子演示了提样: Could not find any version that matches com.android.support:appcomp ...

  5. 并行计算基础&amp;编程模型与工具

    在当前计算机应用中,对快速并行计算的需求是广泛的,归纳起来,主要有三种类型的应用需求: 计算密集(Computer-Intensive)型应用,如大型科学project计算与数值模拟: 数据密集(Da ...

  6. 调用百度地图API实现手机自动定位 (逆地址解析)

    //声明地址解析器 var geoc = new BMap.Geocoder(); //自动定位 var autoLocation = function () { if (navigator.geol ...

  7. ASP.NET网页抓取数据

    我的数据通过一个TextBox输入,这些代码是写在一个button的点击事件里的. 网页数据抓取大概分为两步,第一步是获取网页源代码: 具体注释如下: var currentUrl = TextBox ...

  8. (转)怎样查看局域网中自己的IP地址和其他电脑的IP地址?

    开始菜单->运行->打cmd,回车->再弹出的黑框里打ipconfig -all,回车显示的IP Address就是你的ip地址看局域网的电脑的ip用软件比较方便,比如p2p终结者, ...

  9. 【Nutch2.2.1源代码分析之5】索引的基本流程

    一.各个主要类之间的关系 SolrIndexerJob extends IndexerJob 1.IndexerJob:主要完成 2.SolrIndexerJob:主要完成 3.IndexUtil:主 ...

  10. phpwind 去除init.phpwind.net统计功能

    修改的文件如下:global.phplib/staticpage.class.phprequire/template.phpsimple/index.php