浅拷贝构造函数与深拷贝构造函数

Posted weiyouqing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅拷贝构造函数与深拷贝构造函数相关的知识,希望对你有一定的参考价值。

1.浅拷贝构造函数

#include <iostream>
using namespace std;

class Base
{
public:
    int x;
};

class Object : public Base
{
public:
    Object(int a,int b)
    {
        this->a = a;
        this->b = b;
    }

    Object(const Object &other): Base(other)  //手动添加的拷贝构造函数,对基类拷贝构造函数
    {
        cout << "this is copy+" << endl;
        this->a = other.a;
        this->b = other.b;
    }

private:
    int a;
    int b;
};

int main(int argc, char * argv[])
{
    Object obja(1, 2);
    obja.x = 123;

    Object objb(obja);

    system("pause");
    return 0;
}

浅拷贝构造函数:1.浅拷贝构造函数中必须对每个成员变量进行拷贝;

        2.继承的类,必须对父类进行拷贝;

        3.浅拷贝构造函数可省略,系统会有默认拷贝构造函数,就是对类的成员变量进行一一拷贝;

        

2.深拷贝构造函数-必须实现构造函数

#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class Object
{
public:
    Object(char * str)
    {
        m_size = strlen(str)+1;
        m_buf = new char[m_size];
        strcpy(m_buf,str);
        printf("%s
",m_buf);
    }

    ~Object()
    {
        delete[] m_buf;
    }

private:
    char *m_buf;
    int m_size;
};

int main(int argc, char * argv[])
{
    Object obja("hello world");

    Object objb(obja);

    system("pause");
    return 0;
}

上述代码在析构时,出现错误:

  主要原因是因为使用了系统的默认拷贝构造函数,相当于执行了以下代码:

    objb.m_buf = obja.m_buf;
    objb.m_size = obja.m_buf;

  这样两个对象指针,指向了同一块内存;

  析构时,先析构了obja,指向的内存被释放,再析构objb时,发现内存已经被释放,导致程序崩溃;

因此,此时需要手动写一个拷贝构造函数,目的是拷贝数据,而不是拷贝指针;见如下代码:

#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class Object
{
public:
    Object(char * str)
    {
        m_size = strlen(str)+1;
        m_buf = new char[m_size];
        strcpy(m_buf,str);
        printf("%s
",m_buf);
    }

    ~Object()
    {
        delete[] m_buf;
    }

    Object(const Object &other)
    {
        m_size = other.m_size;
        m_buf = new char[m_size];
        strcpy(m_buf,other.m_buf);
    }

private:
    char *m_buf;
    int m_size;
};

int main(int argc, char * argv[])
{
    Object obja("hello world");

    Object objb(obja);

    system("pause");
    return 0;
}

上述代码中的红色部分,手动实现的拷贝构造函数中申请一块新的内存,然后对数据进行拷贝。

 

以上是关于浅拷贝构造函数与深拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript非构造函数的继承( object()方法浅拷贝与深拷贝 )

拷贝构造函数(c++常问问题一)

C++:浅拷贝与深拷贝

C++:浅拷贝与深拷贝

QImage的浅拷贝与深拷贝

C++——浅拷贝深拷贝写时拷贝详解