#include<bits/stdc++.h>
using namespace std;
class sstring{
public:
sstring(const char *p=nullptr){
cout<<"sstring(const char *p=nullptr)"<<endl;
if(p==nullptr){
_p=new char[1];
_p[0]='\0';
}else{
int len=strlen(p)+1;
_p=new char[len];
for(int i=0;i<len-1;i++){
_p[i]=p[i];
}
_p[len-1]='\0';
}
}
~sstring(){
cout<<"~sstring(){"<<endl;
delete[] _p;
}
sstring(const sstring & str){//注意深拷贝
cout<<"sstring(const sstring & str)"<<endl;
int len=strlen(str._p)+1;
_p=new char[len];
for(int i=0;i<len-1;i++){
_p[i]=str._p[i];
}
_p[len-1]='\0';
}
sstring(sstring&& str){
cout<<"sstring(sstring&& str)"<<endl;
_p=str._p;
str._p =new char[1];
str._p[0]='\0';
}
sstring&operator=(const sstring & str){
cout<<"sstring&operator=(const sstring & str)"<<endl;
if(&str==this)return *this;
delete[]_p;
int len=strlen(str._p)+1;
_p=new char[len];
for(int i=0;i<len-1;i++){
_p[i]=str._p[i];
}
_p[len-1]='\0';
return *this;
}
sstring&operator=(sstring&& str){
cout<<"sstring&operator=(sstring&& str)"<<endl;
if(&str==this)return *this;
delete[]_p;
_p=str._p;
str._p =new char[1];
str._p[0]='\0';
return *this;
}
void show(){
cout<<_p<<endl;
}
private:
char *_p;
};
sstring get(sstring &ss){
sstring s(ss);
return s;
}
int main(){
sstring ss("gaohuqun");
// sstring s= get(ss);
sstring s;//如果sstring s= get(ss);返回将不会创造临时量,临时量被优化,直接构造。
// cout<<"main"<<endl;
s=get(ss);//这里使用右值拷贝构造
s.show();
return 0;
}
/*
总结:
右值拷贝构造的时候:注意右值的处理。
右值拷贝赋值的时候注意:自己资源的释放,和右值的处理
*/
C++手撕string(构造+析构+拷贝+右值拷贝)
最新推荐文章于 2024-08-20 18:14:47 发布