可以用作学习ostream,istream,运算符重载,复制构造,赋值构造的学习代码
建议复制到VS CODE中方便查看
#include<iostream>
#include<memory>
#include<string>
#include<cstring>
using namespace std;
class lstring{
char *p_str={nullptr}; //存放字符串地址的指针
int size={0};
public:
lstring(){//默认构造函数
}
lstring(const lstring& str){//拷贝构造函数
if(str.p_str==nullptr)return;
if(&str==this)return;//防止自我复制
int size=(str.size);
if(p_str!=nullptr){
if(this->size<size)
{
delete[] p_str; //扩大空间
p_str=new char[size];
}
}
else{
p_str=new char[size];
}
this->size=size;
strcpy(p_str,str.p_str);
}
lstring(const char* str){ //char*构造函数
int size=strlen(str);
if(this->size<size){
if(p_str!=nullptr)delete[] p_str; //扩大空间
p_str=new char[size];
}
this->size=size;
strcpy(p_str,str);
}
lstring& operator=(const char* str){//char*赋值函数
int size=strlen(str);
if(this->size<size){
if(p_str!=nullptr)
delete[] p_str; //扩大空间
p_str=new char[size];
}
this->size=size;
strcpy(p_str,str);
return *this;
}
lstring& operator=(const lstring& str){//对象的赋值函数
if(str.p_str==nullptr)
{
this->p_str=nullptr;
this->size=0;
return *this;
}
if(&str==this)return *this;//防止自我复制
int size=(str.size);
if(this->size<size){
if(p_str!=nullptr)delete[] p_str; //扩大空间
p_str=new char[size];
}
this->size=size;
strcpy(p_str,str.p_str);
return *this;
}
friend ostream& operator<<(ostream& os,const lstring& str){//重载cout的流运算符
os<<str.p_str;
return os;
}
friend istream& operator>>(istream& os,lstring& str){ //重载cin的流运算符
//重载输入运算符
char buf[2000];
os>>buf;
str=lstring(buf);
return os;
}
char operator[](int pos){ //可以通过下标取值
if(pos>size)return -1;
return this->p_str[pos];
}
char* c_str() const{ //返回const_char*字符串
return p_str;
}
~lstring(){ //析构函数,释放内存
delete[] p_str;
}
};
int main(){
lstring a,b,c("4444"),d(c);
a="1234";
b="3333";
cin>>b;
cout<<a<<endl<<d<<endl<<b<<endl;
cout<<b[0];
return 0;
}