C++学习——拷贝构造函数和移动构造函数

文章目录

    • 1.拷贝构造函数
    • 2.移动构造函数

1.拷贝构造函数

拷贝构造函数,它是一种特殊的构造函数。它的作用就是用一个已经生成的对象来初始化另一个同类的对象。
当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝(而非浅拷贝)的方式复制该指针成员。

浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。深复制在计算机中开辟了一块新的内存地址用于存放复制的对象。

浅层复制之所以危险,是因为两个指针共同指向一片内存空间,若第一个指针将其释放,另一个指针的指向就不合法了。

深拷贝:

#include
using namespace std;

class base {
public:
    base(int value1,int value2) :p(new int),num(value2) {
        *p = value1;
    }

    base(const base& b) :p(new int), num(b.num) {
        *p = *(b.p);
    }//深拷贝

    /*base(const base& b) :p(b.p), num(b.num) {}//浅拷贝*/
    void print() {
        cout << "*p=" << *p << "   num=" << num << endl;
    }
    ~base() {
        delete p;
    }
private:
    int* p;
    int num;
};

int main()
{
    base b1(10, 20);
    b1.print();
    base b2(b1);
    b2.print();
    return 0;
}
*p=10   num=20
*p=10   num=20

浅拷贝:

#include
using namespace std;

class base {
public:
    base(int value1,int value2) :p(new int),num(value2) {
        *p = value1;
    }

    /*base(const base& b) :p(new int), num(b.num) {
        *p = *(b.p);
    }//深拷贝*/

    base(const base& b) :p(b.p), num(b.num) {}//浅拷贝
    void print() {
        cout << "*p=" << *p << "   num=" << num << endl;
    }
    ~base() {
        delete p;
    }
private:
    int* p;
    int num;
};

int main()
{
    base b1(10, 20);
    b1.print();
    base b2(b1);
    b2.print();
    return 0;
}

2.移动构造函数

所谓移动语义,指的就是以移动而非深拷贝的方式初始化含有指针成员的类对象。简单的理解,移动语义指的就是将其他对象(通常是临时对象)拥有的内存资源“移为已用”。

拷贝构造函数中,对于指针,我们一定要采用深层复制,而移动构造函数中,对于指针,我们采用浅层复制。

移动构造函数的参数和拷贝构造函数不同,拷贝构造函数的参数是一个左值引用,但是移动构造函数的初值是一个右值引用。意味着,移动构造函数的参数是一个右值或者将亡值的引用。也就是说,只用用一个右值,或者将亡值初始化另一个对象的时候,才会调用移动构造函数。而那个move语句,就是将一个左值变成一个将亡值。

#include
using namespace std;

class base {
public:
    base(int value1,int value2) :p(new int),num(value2) {
        *p = value1;
    }

    /*base(const base& b) :p(new int), num(b.num) {
        *p = *(b.p);
    }//深拷贝,拷贝构造函数*/

    base(base& b) :p(b.p), num(b.num) {
        b.p = NULL;
    }//移动构造函数
    void print() {
        cout << "*p=" << *p << "   num=" << num << endl;
    }
    ~base() {
        delete p;
    }
private:
    int* p;
    int num;
};

int main()
{
    base b1(10, 20);
    b1.print();
    base b2(b1);
    b2.print();
    return 0;
}
*p=10   num=20
*p=10   num=20

你可能感兴趣的:(C++,指针,c++)