C++ Primer Plus 练习String类

来源:互联网 发布:win8网络限速解除 编辑:程序博客网 时间:2024/06/06 00:28
#include <iostream>using std::ostream;using std::istream;#ifndef STRING_H_#define STRING_H_Hclass String{private:char *str;int len;static int num_strings;static const int CINLIM = 80;public://构造函数与其他函数String(const char *s);//构造函数String();//默认构造函数String(const String &);//拷贝构造函数~String();//析构函数int length() const {return len};//重载操作符String & operator= (const String &);String & operator= (const char *);char & operator[] (int i);const char & operator[] (int i) const;//友元重载操作符friend bool operator<(const String &st. const String &st2);friend bool operator>(const String &st. const String &st2);friend bool operator==(const String &st. const String &st2);friend ostream & operator<<(ostream & os, const String &st);friend istream & operator>>(istream & is, String &st);//静态函数static int HowMany();}#endif#include "String.h"using std::cin;using std::cout;//初始化静态成员int String::number_strings = 0;//静态函数int String::HowMany(){return num_strings;}//类函数//C String构造函数String::String(const char *s){len = strlen(s);str = new char[len + 1];std::copy(str, s);//内存重叠?num_strings++;}//默认构造函数String::String(){len = 1;str = new char[1];str[0] = '\0';nmum_strings++;}//复制构造函数String::String(const String & st){len = st.len;str = new char[len + 1];std::copy(str, st.str);num_string++;}//赋值重载String * String::operator=(const String &st){if(this == &st)return *this;delete[] str;len = st.len;str = new char[len + 1];std::copy(str, st.str);return *this;}String & String::operator=(const char *s){delete [] str;len = std::strlen(s);str = new char[len + 1];std::strcpy(str, s);return *this;}char & String::operator[](int i){return str[i];}//返回char & 可以实现 // String str("might"); str[0] = 'r';// 这里将'r'赋值给 operator[](int i)的返回值,即一个str[i]的引用,即// str.operator[](0) = 'r'// str.str[0] = 'r'// 实现了改变数组的内容 const char & String::operator[](int i)const{return str[i];}//友元bool operator < (const String &st1, const String &st2){return (std::strcmp(st1.str, st2.str) < 0);}bool operator > (const String &st1, const String &st2){return (std::strcmp(st1.str, st2.str) >0);}bool operator > (const String &st1, const String &st2){return (std::strcmp(st1.str, st2.str) == 0);}ostream & operator << (ostream & os, const String & st){os << str;return os;}istream & operator >> (istream & is, String & st){char temp[String::CINLIM];//如何不用这个呢?用链表来存?is.get(temp, String::CINLIM);if(is)st = temp;while(is & is.get()!= '\n')continue;return is;}

0 0