我跟很多童鞋一样,目前也在学习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;
  }
  }