C++简单String类的实现
作者:网络转载 发布时间:[ 2017/2/15 10:37:50 ] 推荐标签:测试开发技术 String C++
我跟很多童鞋一样,目前也在学习C++中,昨天正在学习has-a关系中的包含时,例题是将string类包含的,因为是小白嘛,嘿嘿,为了更深的理解包含以及其他相关问题,果断上机边敲代码边理解咯,既然用到了string类,自己突然想写个简易的string类(毕竟之前书中提到过编写简易string类,但也只是看看,还没来得及自己写一个)于是自己写了一个简易的string类,也算对之前学到的部分知识一个小小的汇总,string类也是很考研小白的内存管理的,这个String类也是我调试了很多遍后没啥问题才敢发出来的,嘻嘻,废话不多说,附上自己写的string类。只写了部分主要功能,其他功能,以后用到后,再陆续添加。如果代码上有什么问题的话,还请各位大大能指点小弟我下。
String头文件:
#ifndef STRING_H_
#define STRING_H_
#include <iostream>
//StringClass
class String{
private:
char* StringTemp;
protected:
public:
String(char* Str = NULL);
String(const String & KStr_t);
virtual ~String();
int lenght()const;
char operator[](unsigned int Count);
friend std::ostream & operator<<(std::ostream & output,const String & KStr_t);
friend std::istream & operator>>(std::istream & input,String & KStr_t);
String & operator=(const String & KStr_t);
String & operator=(const char* KStr_t);
String operator+(const String & KStr_t)const;
bool operator==(const String & KStr_t)const;
};
#endif
String实现:
#include "String.h"
#include <iostream>
String::String(char* Str){
if(Str == NULL){
StringTemp = new char[1];
strcpy(StringTemp,"");
}
else{
StringTemp = new char[strlen(Str)+1];
strcpy(StringTemp,Str);
}
}
String::~String(){
delete []StringTemp; //释放内存
}
//String测字符串长度方法
int String::lenght()const{
return strlen(StringTemp);
}
char String::operator[](unsigned int Count){
if(Count>=0&&Count<strlen(StringTemp)){
return StringTemp[Count];
}
}
//重载<<运算符,用于直接对对象进行输出
std::ostream & operator<<(std::ostream & output,const String & KStr_t){
output << KStr_t.StringTemp;
return output;
}
//重载>>运算符,用于直接对对象进行输入字符串
std::istream & operator>>(std::istream & input,String & KStr_t){
delete []KStr_t.StringTemp;
char StrTemp[255]; <span style="white-space:pre"> </span>//申请255字节空间存放临时字符串
input.getline(StrTemp,254);
KStr_t.StringTemp = new char[strlen(StrTemp)+1];
strcpy(KStr_t.StringTemp,StrTemp);
return input;
}
//同类型对象赋值方法
String & String::operator=(const String & KStr_t){
if(this == &KStr_t){return *this;} //判断是否为将自身赋值给自身
delete StringTemp; //由于是赋值操作,所以要先
将原来的指针所指向的堆内存给释放掉,以免造成内存泄漏
StringTemp = new char[strlen(KStr_t.StringTemp)+1];
strcpy(StringTemp,KStr_t.StringTemp);
return *this; //返回自身引用,以便能继续
赋值
}
//用于对String对象赋值字符串
String & String::operator=(const char* KStr_t){
delete StringTemp; //首先释放掉String对象
StringTemp指针所指向的堆内存块,防止内存泄漏
StringTemp = new char[strlen(KStr_t)+1];
strcpy(StringTemp,KStr_t);
return *this;
}
//模拟String对象字符串相加的操作
String String::operator+(const String & KStr_t)const{
String Temp;
Temp.StringTemp = new char[strlen(StringTemp)+strlen(KStr_t.StringTemp)+1]; //由于需要将两个String对象
字符串相加,所以要申请能足够大的内存块
strcpy(Temp.StringTemp,StringTemp);
strcat(Temp.StringTemp,KStr_t.StringTemp); //字符串连接函数,不懂有啥用的谷歌一
下
return Temp; //返回两个字符串相加(字符串链接)后的String对象,由于该临时对象是在函数内部声明的(局部对象)所以要返回该对象而不是该对象的引用
}
//用同类对象初始化的构造函数
String::String(const String & KStr_t){
StringTemp = new char[strlen(KStr_t.StringTemp)+1];
strcpy(StringTemp,KStr_t.StringTemp);
}
//判断两个String对象所存储字符串是否相等,相等返回true否则返回false
bool String::operator==(const String & KStr_t)const{
if(strcmp(StringTemp,KStr_t.StringTemp)==0){
return true;
}
else{
return false;
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11