#ifndef STR_HH_HH #define STR_HH_HH class Str { friend std::istream& operator>>(std::istream&,Str&); //友元函数可以在类定义的任何一个地方,把它加在public或private后面是没有区别的,应为它具有特殊的访问权限,所以它是类接口的一部分 public: typedef vec<char>::size_type size_type; //默认构造函数,创建一个空的Str Str(){} //生成一个Str对象,包含c的n个复件 Str(size_type n,char c):data(n,c){} 生成一个Str对象并用一个空字符结尾的字符数组来初始化 Str(const char *cp){ std::copy(cp,cp+std::strlen(cp),std::back_insert(data)); } //生成一个Str对象并用迭代器b和e之间的内容对它进行初始化 template<class In> Str(In b,In e){ std::copy(b,e,std::back_insert(data)); } //因为有默认的操作,Str类本身没有分配内存的能力,它把管理内存的细节留给编译器,让编译器自动生成相应的函数,而这些函数用过调用Vec的相应的函数来操作 private: vec<char> data; }; isstream& operator>>(isstream& is,Str& s) { //抹去存在的值 s.data.clear(); char c; //按序读字符并忽略前面的空格字符 while(is.get(c) && isspace(c)) ; //只判断循环条件,不进行其它工作 if(is){ do s.data.push_back(c); //产生一个错误的编译,data是私有成员数据 while(is.get(c)&& !isspace(c)); //如果遇到一个空格字符,把它放在输入流的后面 } return is; } #endif