自定义的string类
头文件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类的更多相关文章
- C++基础 (5) 第五天 重载new delete () 只能操作符 自定义string类
1 昨日回顾 1.static 对整个类共享 可以直接用 类::方法 调用 如果是私有的 可以提供一个静态的访问静态成员的方法 2 自定义的数组类-重载操作符[] 3 重载new和delete 4 重 ...
- 自定义String类,并且实现在STL容器中添加自定义的类型
13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 1 ...
- java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)
代码部分: public static void main(String[] args) { testInt(); testString(); testArray(); testX(); } publ ...
- 自定义string类
#include <iostream> #include <cstring> using namespace std; class String; class Data{ // ...
- Android 自定义Activity基类与TitleBar
我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...
- hadoop编程小技巧(5)---自定义输入文件格式类InputFormat
Hadoop代码测试环境:Hadoop2.4 应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForma ...
- Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)
Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...
- Java中String类的format方法使用总结
可参考: http://www.cnblogs.com/fsjohnhuang/p/4094777.html http://kgd1120.iteye.com/blog/1293633 String类 ...
- String类源码分析(JDK1.7)
以下学习根据JDK1.7String类源代码做注释 public final class String implements java.io.Serializable, Comparable<S ...
随机推荐
- CSS的基本认识
1.定义: 级联样式表(Cascading Style Sheet)简称“CSS”,通常又称为“风格样式表(Style Sheet)”,它是用来进行网页风格设计的. 2.对CSS的基本认识: CSS是 ...
- phpStorm 各种快捷键
1. ctrl + shift + n: 打开工程中的文件(类似于eclipse中的ctrl+shift+R),目的是打开当前工程下任意目录的文件. 2. ctrl + j: 输出模板 3. ctrl ...
- H264编码技术
H.264的目标应用涵盖了眼下大部分的视频服务,如有线电视远程监控.交互媒体.数字电视.视频会议.视频点播.流媒体服务等.H.264为解决不同应用中的网络传输的差异.定义了两层:视频编码层(VCL:V ...
- 【Spark】Spark的Shuffle机制
MapReduce中的Shuffle 在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性 ...
- js将日期格式的时候转换成时间搓
自己写的一个方法 function split_time(time){//将当前时间转换成时间搓 例如2013-09-11 12:12:12 var arr=time.split(" ...
- eclipse 中 maven3 创建web项目
一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建 ...
- wlan0 Interface doesn't support scanning : Device or resource busy
Problem: wlan0 Interface doesn't support scanning : Device or resource busy. Solved Way: sudo ifcong ...
- android 中文件加密 解密 算法实战
现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多.防止有人交一份钱,把所有的课件就拷给了别人.这样的事情培训机构肯定是不愿意的.现在我项目里 ...
- Redis的快照功能
引言: Redis是基于内存的数据库,同时也提供了若干持久化的方案,允许用户把内存中的数据,写入本地文件系统,以备下次重启或者当机之后继续使用.本文将描述如何基于Redis来设置这些功能. 快照的设 ...
- javascript 模仿 html5 placeholder
<form action="?action=deliver" method="post" class="deliver-form"&g ...