c++ String实现 基于Vector

来源:互联网 发布:淘宝聊天记录 编辑:程序博客网 时间:2024/06/09 22:01

学习这个,了解到的东西就是

一个函数的返回值如果是对象引用,那么这个返回值绝不能是一个局部变量;如果函数返回值是一个对象,那么返回值就是对象的副本了。

#ifndef _str_H#define _str_h#include"vec.h"#include<cstring>#include<cctype>#include<algorithm>#include<iterator>class Str{Vec<char> data;friend std::istream& operator>>(std::istream&,Str&);public:typedef Vec<char>::size_type size_type;Str() {}Str(size_type n,char c):data(n,c) { }Str(const char* s) {std::copy(s,s+std::strlen(s),std::back_inserter(data));}template <class In> Str(In a,In b){ std::copy(a,b,std::back_inserter(data)); }size_type size()const {return data.size();}char& operator[](size_type i) {return data[i];}const char& operator[](size_type i)const {return data[i];}Str& operator+=(const Str& s){std::copy(s.data.begin(),s.data.end(),std::back_inserter(data));return *this;}};std::istream& operator>>(std::istream& is,Str& str){str.data.clear();char c;while(is.get(c) && std::isspace(c))  ;if(is){do str.data.push_back(c);while(is.get(c)&& !std::isspace(c));}if(is)  is.unget();return is;}std::ostream& operator<<(std::ostream& os,Str& str){Str::size_type i;for(i=0;i!=str.size();i++)  os<<str[i]; return os;}Str operator+(const Str& s1,const Str& s2){                             //千万不要返回局部对象的引用, Str s=s1;                                                          //函数返回值必须是Str,不能说Str& s+=s2;                                                             //因为s是局部变量,函数结束就要释放内存 return s;                                                          //返回值是Str,则返回s的一份副本!!!高 }#endif

测试例程

#include"vec.h"#include"str.h"#include<iostream>using namespace std;int main(){Str s1(2,'c');cout<<s1;cout<<endl;Str s2=s1;cout<<s2;cout<<endl;Str s3=s1+"ss";cout<<s3;cout<<endl;s3+=s2;cout<<s3;}

好了,就 酱

0 0
原创粉丝点击