string 使用 operator+超出内存

operator+=返回的是引用,而operator+返回的是值,使用operator+在C++11之前很有可能会导致大量的拷贝行为,需要有额外的空间来存储临时创建的右值,在string很大的情况下,就有可能超出内存限制。

#include<iostream> #include<cstring> using namespace std; class String{ public: char* str; String(char* a){ str=new char[strlen(a)+1]; strcpy(str,a); } String(){ str=NULL; } friend istream & operator>>(istream &i,String &op) //liucharu { char *p =new char[30]; op.str=p; i>>op.str; return i; } friend ostream & operator<<(ostream &o,String &op) //liutiqv { o<<op.str<<endl; return o; } String & operator=(const char* op) { if(str) delete []str; if(op){ str=new char[strlen(op)+1]; strcpy(str,op); } else str=NULL; return* this; } String operator+(const String &op) { strcat(str,op.str); return* this; } String operator+=(char *op) { strcat(str,op); return* this; } char & operator[](int n) str[5] { return str[n]; } bool operator<(const String &op) { if(strcmp(str,op.str)>0) return false; else return true; } void replace(int pos,int n,char* s){ int i=strlen(str); if(i<pos-1) //HUOQVZIFUCHUANCHANGDU cout<<"超出范围!"; else { n=n-1; strcpy(str+pos+n,s); // s到str 拷贝 cong pos +n kaobei } } String(const String &a){ char *b=new char[30]; this->str=b; strcpy(str,a.str); } ~String() { delete []str; } }; char find(String& s,int pos){ // chaxun int i=strlen(s.str); if(i<pos-1) cout<<"超出范围!"; else { pos=pos-1; return s.str[pos]; } } int main() { cout<<"请输入S1与S2\n"; String s1,s2; cin>>s1>>s2; while(1) { cout<<"1.查找s1第pos个字符\n"; cout<<"2.s1从pos开始的n个字符替换为s2\n"; cout<<"3.拷贝s2至s3\n"; int n; cin>>n; switch(n){ case 1:{ cout<<"输入pos\n"; int pos; cin>>pos; cout<<find(s1,pos)<<endl; };break; case 2:{ cout<<"输入pos,n\n"; int pos,n; cin>>pos>>n; s1.replace(pos,n,s2.str); cout<<s1.str<<endl; };break; case 3:{ String s3(s2); cout<<s3.str<<endl; };break; } } return 0; }加注释
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值