1移动赋值运算符.cpp
#include<iostream>
#include<string.h>
using namespace std;
class my_string{
char* p=nullptr;
public:
my_string(){}
my_string(const char* s){
if(s){
p = new char[strlen(s)+1];
strcpy(p,s);
}
}
my_string( const my_string& ms){
cout<<"copy construction"<<endl;
if(ms.p){
if(p)delete []p;
p = new char[ms.size()+1];
strcpy(p,ms.p);
}
}
~my_string(){
if(p)delete [] p;
}
my_string(my_string && s)
{
cout<<"move construction"<<endl;
p = s.p;
s.p =nullptr;
}
friend ostream &operator<<(ostream&cout,my_string s);
char & operator[](int pos)
{
return p[pos];
}
int size()const{return strlen(p);}
my_string operator+(my_string &s)
{
my_string tmp;
tmp.p= new char[this->size()+s.size()+1];
strcpy(tmp.p,this->p);
strcat(tmp.p,s.p);
return tmp;
}
my_string operator+(const char* s)
{
my_string tmp;
tmp.p= new char[this->size()+strlen(s)+1];
strcpy(tmp.p,this->p);
strcat(tmp.p,s);
return tmp;
}
my_string &operator=(my_string &&s)
{
cout<<"move assignment=(&&)"<<endl;
p = s.p;
s.p =nullptr;
}
};
ostream &operator<<(ostream&cout,my_string s)
{
cout<<s.p;
return cout;
}
int main()
{
my_string s1="123";
my_string s2="456";
my_string s3;
//不要把一个左值轻易转换为右值使用,除非你确定它在下面不再被使用
//err: my_string s4(std::move(s1));
//移动赋值运算,提高了运算效率,没有拷贝的过程
s3 =s1+s2;
//(a=b)=c;
int a=1,b=1,c=1;
(a=b)=c;
return 0;
}