c++-移动构造和赋值函数处理

61 阅读1分钟

移动构造函数和赋值函数出现的空指针一定记住要特殊处理

  • b和c的pi指针变为空后有些函数要特别处理要不会出错
#include<algorithm>
#include<string>
#include<utility>
using namespace std;

class Cpmv
{
public:
    struct Info
    {
        string qcode;
        string zcode;
    };
private:
    Info *pi;
public:
    Cpmv();
    Cpmv(string q,string z);
    Cpmv(const Cpmv& cp);
    Cpmv(Cpmv && mv);
    ~Cpmv();
    Cpmv & operator =(const Cpmv &cp);
    Cpmv & operator =(Cpmv &&cp);
    Cpmv operator +(const Cpmv& obj) const;
    void Display() const;
};

int main(){
    Cpmv a;
    a.Display();
    string str1="abcd";
    string str2="efghijklmnopq";
    Cpmv b(str1,str2);
    b.Display();
    Cpmv c(b);
    c.Display();
    Cpmv d(move(b));
    d.Display();
    Cpmv e;
    e=c;
    e.Display();
    Cpmv f;
    f=e+b;
    f.Display();
    return 0;
}

Cpmv::Cpmv(string q,string z){
    pi=new Info;
    pi->qcode=q;
    pi->zcode=z;
}

Cpmv::Cpmv(){
    pi=new Info;
    pi->qcode="none";
    pi->zcode="none";
}

Cpmv::Cpmv(const Cpmv& cp){
    cout<<"nomal !"<<endl;
    pi=new Info;
    pi->qcode=cp.pi->qcode;
    pi->zcode=cp.pi->zcode;
}

Cpmv::Cpmv(Cpmv && mv){
    cout<<"move !"<<endl;
    pi=new Info;
    pi=mv.pi;
    mv.pi=nullptr;
}

Cpmv::~Cpmv(){
    delete pi;
}

Cpmv & Cpmv::operator =(const Cpmv &cp){
    cout<<"nomal =!"<<endl;
    if(this==&cp) return *this;
    delete pi;
    pi=new Info;
    pi->qcode=cp.pi->qcode;
    pi->zcode=cp.pi->zcode;
    return *this;
}

Cpmv & Cpmv::operator =(Cpmv &&cp){
    cout<<"move =!"<<endl;
    if(this==&cp) return *this;
    delete pi;
    pi=new Info;
    pi=cp.pi;
    cp.pi=nullptr;
    return *this;
}

Cpmv Cpmv::operator +(const Cpmv& obj) const
{
    if(!this->pi){              //一定要考虑的是移动构造和赋值构造后的空指针的处理
        if(!obj.pi){
            return *this;
        }
        else return obj;
    }
    if(!obj.pi) return *this;
    else return Cpmv(this->pi->qcode+obj.pi->qcode,this->pi->zcode+obj.pi->zcode);
}

void Cpmv::Display() const
{   
    if(!this->pi){
        cout<<"this cpmv is null"<<endl;
        return;
    }
    cout<<this->pi->qcode<<" "<<this->pi->zcode<<endl;
}