C++类的六大函数--构造、析构、拷贝构造、移动构造、拷贝赋值、移动赋值

本文深入探讨了拷贝构造函数与移动构造函数的区别,以及拷贝赋值函数和移动赋值函数的应用场景。通过代码实例,详细解释了深拷贝与浅拷贝的概念,以及在C++中如何实现这些函数,确保对象的正确复制和资源的有效管理。

1.拷贝构造函数和移动构造函数

总的来说,都是用一个已有的对象去创建构造一个新的对象。

当对象中含有指针或类作为数据成员的,对于已有的对象在构造出新的对象后,仍需要对该已有对象进行引用或利用的,需要我们自己定义拷贝构造函数(进行深拷贝)。

而对于已有的对象在构造出新的对象后,将不再对该已有对象进行引用或利用的,需要我们自己定义移动构造函数(进行浅拷贝)。

拷贝构造函数和移动构造函数调用规则可以按下图1-1进行:

1-1 拷贝构造函数和移动构造函数的简单调用规则图

2.拷贝赋值函数和移动赋值函数

对于拷贝赋值和移动赋值,则都是用一个已有对象将其值赋值给另一个已有对象。

其调用赋值函数类型的规则与拷贝构造函数和移动构造函数调用规则相似,都是根据对象是否继续进行利用选择,调用规则可以按下图1-2进行:

 

1-2 拷贝赋值和移动赋值的简单调用规则图

代码测试实验代码:

 

    //拷贝构造函数
    vector (const vector &rhs ):theSize{rhs.theSize},
        theCapacity{ rhs.theCapacity }, objects{ nullptr }
    {
        objects = new Object[theCapacity];
        for (int i = 0; i < theSize; ++i)
            objects[i] = rhs.objects[i];
        std::cout << "拷贝构造" << std::endl;

    }
    //拷贝赋值函数
    vector & operator =(const vector &rhs)
    {
        vector copy = rhs;
        std::swap(*this, copy);    
        /*利用移动交换
        void swap(vector<object> &x,vector <object> &y)
        {
            vector<object> temp = std:: move( x );
            x = std::move( y );
            y = std::move( temp );
        }
        若是利用赋值交换,则会进入死循环
         void swap((vector<object> &x,vector <object> &y)
        {
            vector<object> temp = x ; //这里会重新调用赋值函数,陷入死循环
            x = y ;
            y = temp ;
        }
        */
        std::cout << "拷贝赋值" << std::endl;

        return *this;
    }
    //移动构造函数
    vector (vector && rhs):theSize{rhs.theSize},
        theCapacity{ rhs.theCapacity }, objects{ rhs.objects }//objects 这里与拷贝构造函数不同了,拷贝的是null
    {
        rhs.objects = nullptr;
        rhs.theSize = 0;
        rhs.theCapacity = 0;
        std::cout << "移动构造" << std::endl;

    }
    //移动赋值函数
    vector &operator =(vector && rhs)
    {
        std::swap(theSize, rhs.theSize);
        std::swap(theCapacity, rhs.theCapacity);
        std::swap(objects, rhs.objects);
        /*利用赋值交换
        void swap((vector<object> &x,vector <object> &y)
        {
            vector<object> temp = x ;
            x = y ;
            y = temp ;
        }
        若是利用移动交换,则会进入死循环
        void swap(vector<object> &x,vector <object> &y)
        {
            vector<object> temp = std:: move( x ); //这里会重新调用移动函数,陷入死循环
            x = std::move( y );
            y = std::move( temp );
        }
        */
        std::cout << "移动赋值" << std::endl;

        return *this;
    }

 

转载于:https://www.cnblogs.com/lincz/p/10768607.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值