大挪耗

c++移动语义

#include "iostream"
#include "cstring"
using namespace::std;

class AA
{
public:
    int *m_data= nullptr;//数据成员,指向取区资源的指针。
    AA()=default;//启用默认构造函数。
    void alloc()//给成员m_data函数分配内存
    {
        m_data=new int ;//分配内存
        memset(m_data,0,sizeof (int ));//初始化已分配内存。
    }

    AA(const AA&a)//拷贝构造函数。
    {
        cout<<"调用了拷贝构造函数。\n";
        if(m_data== nullptr)alloc();  //如果没有分配内存,就分配。
        memcpy(m_data,a.m_data,sizeof (int));
    }

    AA(AA&&a)//移动构造函数
    {
        cout<<"调用了移动构造函数。\n";
        if(m_data!= nullptr)delete m_data;  //如果没有分配内存,就分配。
        m_data=a.m_data;
        a.m_data= nullptr;
    }

    AA&operator=(const AA&a)//赋值函数。
    {
        cout<<"调用了赋值函数。\n";//显示自己被调用的日志。
        if(this ==&a)return *this;
        if(m_data== nullptr)alloc();
        memcpy(m_data,a.m_data,sizeof (int));
        return *this;
    }

    AA&operator=(AA&&a)//移动赋值函数。
    {
        cout<<"调用了移动赋值函数。\n";//显示自己被调用的日志。
        if(this ==&a)return *this;
        if(m_data!= nullptr)delete m_data;  //如果没有分配内存,就分配。
        m_data=a.m_data;
        a.m_data= nullptr;
        return *this;
    }

    ~AA()//析构函数。
    {
        if(m_data!= nullptr)
        {
            delete m_data;m_data= nullptr;
        }
    }

};

int main()
{
    AA a1;//创建对象a1.
    a1.alloc();//分配堆区资源。
    *a1.m_data=3;//给对其内存赋值。
    cout<<"a1.m_data="<<*a1.m_data<<endl;

    AA a2=a1;//将调用拷贝构造函数
    cout<<"a2.m_data="<<*a2.m_data<<endl;



    AA a3;
    a3=a1;    //将调用赋值函数
    cout<<"a3.data="<<*a3.m_data<<endl;
    //a1有名字是左值但在赋值会优先调用右值。除非使用move函数。
    a3=move(a1);    //将调用移动赋值函数
    cout<<"a3.data="<<*a3.m_data<<endl;
    auto f=[]{AA aa;aa.alloc();*aa.m_data=8;return aa;};//返回AA类对象的lambda函数。
    AA a4=f();  //lambda函数返回临时对象,是右值,将调用移动构造函数;
    cout<<"a4.m_data="<<*a4.m_data<<endl;

    AA a6;
    a6=f() ;  //将调用赋值函数。
    cout<<"a6.m_data="<<*a6.m_data<<endl;

}

a1.m_data=3
调用了拷贝构造函数。
a2.m_data=3
调用了赋值函数。
a3.data=3
调用了移动赋值函数。
a3.data=3
a4.m_data=8
调用了移动赋值函数。
a6.m_data=8


已发布

分类

可以收藏大挪耗一下。下载麻烦点城通网盘,站长保证下载速度,不会限速的,放心点就是了;分卷,安卓下载为txt:程序下载为url,不会下载参考不会下载。如果你想让本站活的久一点,请直接捐助

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注