这是之前学习C++时,书中要求自己实现一份简易String,然后就实现了一份....下面是部分功能代码,提供给需要的人参考下,如果有什么问题也可以下方评论~
“kString.h”
#ifndef KSTRING_H_
#define KSTRING_H_
#include <iostream>
class kString{
private:
char* str;
int Len;
public:
//构造函数和析构函数
kString();
kString(const char* str_t);
kString(const kString& t);
kString& operator=(const kString& t);
~kString();
int kSize();
char& operator[](int n);
char operator[](int n)const;
//关系运算符重载
friend bool operator>(const kString& s1,const kString& s2);
friend bool operator<(const kString& s1,const kString& s2);
friend bool operator==(const kString& s1,const kString& s2);
friend bool operator>=(const kString& s1,const kString& s2);
friend bool operator<=(const kString& s1,const kString& s2);
friend std::ostream& operator<<(std::ostream& out_t, const kString& t);
};
#endif
“kString.cpp”
#include "kString.h"
#include <iostream>
//默认构造函数 创建空String
kString::kString(){
str = NULL;
Len = 0;
}
kString::kString(const char* str_t){
Len = strlen(str_t);
str = new char[Len+1];
strcpy(str,str_t);
}
kString::kString(const kString& t){
Len = t.Len;
str = new char[Len+1];
strcpy(str,t.str);
}
//虽然加入证同测试的赋值操作 但是该函数并不具备异常安全性
kString& kString::operator=(const kString& t){
if(this==&t){ //证同测试
return *this;
}else{
delete []str;
Len = t.Len;
str = new char[Len+1]; //这里可能会引发异常(std::bad_alloc)导致类数据败坏
strcpy(str,t.str);
return *this;
}
}
/*
//既有证同测试也增加了异常安全性
kString& kString::operator=(const kString& t){
if(this==&t){
return *this;
}else{
char* str_t = str; //用作临时存储 当new正常执行没发生异常 再将旧指针所指内存释放掉
Len = t.Len;
str = new char[Len+1];
strcpy(str,t.str);
delete str_t;
return *this;
}
}
*/
//析构函数 用于释放指向的字符串所在内存
kString::~kString(){
delete[]str;
}
//返回当前String字符数
int kString::kSize(){
return Len;
}
//重载<< 以便可以直接对kString对象进行输出操作
std::ostream& operator<<(std::ostream& out_t, const kString& t){
out_t << t.str;
return out_t;
}
//non-const版
char& kString::operator[](int n){
return str[n];
}
//
//const char& kString::operator[](int n)const{
// return str[n];
//}
//const版 用于const对象时调用
char kString::operator[](int n)const{
return str[n];
}
//以下是对关系运算符重载 以便可以直接对该kString对象进行比较
bool operator>(const kString& s1,const kString& s2){
if(strcmp(s1.str,s2.str)>0){
return true;
}else{
return false;
}
}
bool operator<(const kString& s1,const kString& s2){
if(strcmp(s1.str,s2.str)<0){
return true;
}else{
return false;
}
}
bool operator==(const kString& s1,const kString& s2){
if(strcmp(s1.str,s2.str)==0){
return true;
}else{
return false;
}
}
bool operator>=(const kString& s1,const kString& s2){
if(strcmp(s1.str,s2.str)>0 || strcmp(s1.str,s2.str)==0){
return true;
}else{
return false;
}
}
bool operator<=(const kString& s1,const kString& s2){
if(strcmp(s1.str,s2.str)<0 || strcmp(s1.str,s2.str)==0){
return true;
}else{
return false;
}
}
测试代码就不帖上来了,测试功能都正常~因为是简易版与C++String相比还是有很多功能没有去实现,有兴趣的可以加以完善 添加其他相应功能~