头文件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. java对象在hibernate持久层的状态

    站在持久化层的角度,一个java对象在它的生命周期中,可处于以下4个状态之一: 临时状态(transient):刚刚用new语句创建,还没有被持久化,并且不处于Session的缓存中. 持久化状态(p ...

  2. UBI(unsorted block image )块管理

    一.介绍 ubi是unsorted block images的缩写,是由IBM开发设计的,它与ubifs有不同的含义,ubifs是一种文件系统(nokia开发的):而ubi是一种块管理工具,工作在mt ...

  3. 使用Python,字标注及最大熵法进行中文分词

    使用Python,字标注及最大熵法进行中文分词 在前面的博文中使用python实现了基于词典及匹配的中文分词,这里介绍另外一种方法, 这种方法基于字标注法,并且基于最大熵法,使用机器学习方法进行训练, ...

  4. python:学习defaultdict,namedtuple

    # -*- coding: utf-8 -*-__author__ = 'Administrator'import bisect#排序说明:http://en.wikipedia.org/wiki/i ...

  5. springMVC之annotation优化

    1.在之前配置的spring配置文件中会有这样的代码: <!-- 方法映射 -->  <bean class="org.springframework.web.servle ...

  6. sql获取每门课程成绩最好的学生信息

    1.相关数据表 Score表 [User]表 SQL语句例如以下: --查询出各科成绩最好的学生信息 --自连接 --SELECT TOP 1 * FROM Score B WHERE B.Score ...

  7. 多封装,少开放。强烈建议C++标准添加class之间的注入机制

    近日在改动了一下下引擎代码(为了自己的组件),发现有些接口是仅仅有特定类及其内部函数才去訪问,却不使用友元声明的形式进行数据訪问--当然使用了普通非virtual的形式也就是意味着不建议重载. 故此: ...

  8. ios浅谈关于nil和 NIL区别及相关问题(转)

    转自:http://blog.csdn.net/guozh/article/details/8469131 个就是将引用技术减1,所谓的引用计数就是看看有多个指针指向一块内存实体,当release一次 ...

  9. python - 面向对象(一)

    python是一门面向对象的编程语言,python中的一切均是对象. 有对象就提到类,对象和类就像是儿子和老子的关系,是不可分的一对. 什么是类     类就是具有一些共同特性的事物的统称.好比人类, ...

  10. CodeSmith使用总结--读取一个表试试

    我感觉CodeSmith对于我的最大用途是不用我手动创建每个表的Model.BLL和DAL了,那些繁琐的工作真的让我很无语. CodeSmith要读取数据库中的表就要先连接数据库. 新建一个数据库连接 ...