#ifndef _STRING1_H_ #define _STRING1_H_ #include <iostream> using std::istream; using std::ostream; class Strng { private: int len; char * str; enum { CINMAX = 100}; static int NUMSTR; public: Strng(); Strng(const char *); Strng(const Strng &); ~Strng(); static int HOWMANY(){return NUMSTR;} Strng operator = (const Strng &); char & operator[]( int i) ; const char & operator [] (int i)const ; friend ostream & operator << (ostream & os, const Strng &); friend istream & operator >> (istream & is , Strng &); friend bool operator > (const Strng & , const Strng &); friend bool operator < (const Strng&, const Strng &); friend bool operator == (const Strng& , const Strng &); friend Strng operator + (const Strng&, const Strng &); friend void operator += (Strng&, const Strng &); }; #endif 定义: #include "string1.h" #include <cstring> #include <iostream> using std::istream; using std::ostream; int Strng::NUMSTR= 0; Strng::Strng() { len = 1; str = new char[len]; str[0] = '/0'; NUMSTR++; } Strng::Strng(const char * s) { len = strlen(s) +1; str= new char[len]; strncpy(str, s, len-1); str[len-1] = '/0'; NUMSTR++; } Strng::Strng(const Strng & s) { len =s.len; str = new char[len]; strncpy(str, s.str, len-1); str[len-1] = '/0'; NUMSTR++; } Strng::~Strng() { delete [] str; --NUMSTR; } Strng Strng::operator =(const Strng &s) { if (this == &s) { return * this; } else { delete [] str; len = s.len; str = new char[len]; strncpy(str, s.str, len-1); str[len-1] = '/0'; return * this; } } char & Strng::operator [] ( int i) { return str[i]; } const char & Strng::operator [](int i) const { return str[i]; } ostream & operator << ( ostream & os, const Strng & s) { os << s.str; return os; } istream & operator >> (istream & is, Strng & s) { char ch[Strng::CINMAX]; //is >> ch; //ch[Strng::CINMAX-1] = '/0'; //无法判定缓冲区里是否有上一次留下来的字符(如换行符等) //由此方法可以跳过换行符, 但是输入越界的话程序会死掉 // 改用下面的方法: 换行符的问题依然没有解决,望高手赐教 is.get(ch, Strng::CINMAX); if(is) s = ch; while (is&&is.get() != '/n') {continue; } return is; } bool operator < (const Strng & s1, const Strng & s2) { return strcmp(s1.str, s2.str) < 0; } bool operator > (const Strng & s1, const Strng & s2) { return strcmp(s1.str, s2.str) > 0; } bool operator == (const Strng& s1, const Strng & s2) { return strcmp(s1.str, s2.str) == 0; } Strng operator + (const Strng & s1, const Strng & s2) { Strng temp; delete temp.str; temp.len = s1.len + s2.len -1; temp.str = new char[temp.len]; int i = 0, j = 0; while (s1.str[i] != '/0') { temp.str[i] = s1.str[i]; i++; } while (s2.str[j] != '/0') { temp.str[i+j] = s2.str[j]; j++; } temp.str[temp.len - 1 ] = '/0'; return temp; } void operator += ( Strng & s1, const Strng & s2) { Strng temp; delete temp.str; temp.len = s1.len + s2.len -1; temp.str = new char[temp.len]; int i = 0, j = 0; while (s1.str[i] != '/0') { temp.str[i] = s1.str[i]; i++; } while (s2.str[j] != '/0') { temp.str[i+j] = s2.str[j]; j++; } temp.str[temp.len - 1 ] = '/0'; s1 = temp; } main #include "string1.h" #include <cstring> #include <iostream> using namespace std; int main() { Strng none; Strng kelso("kelso"); Strng susan = "susan"; cout << "kelso:" << kelso << endl; cout << "susan:" << susan << endl; cout << "none:" << none << endl; cout <<"none = none + kelso:"; none = none + kelso; cout << none << endl; cout << "susan = susan + kelso: "; susan = susan + kelso; cout << susan << endl; cout << "kelso += kelso : "; kelso += kelso; cout << kelso << endl; //问题来了 Strng wt; int i; cin >> i; cout << i << endl; cin.sync(); // 必需要加这个清空缓冲区,否则下面就直接读取了一个换行符 cin >>wt; cout << "wt:" << wt << endl; cout << "How many? :" << Strng::HOWMANY() << endl; return 0; }