码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-09-16 19:39:50      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:原因   pac   name   warnings   变量   %s   构造   obj   申请   

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\n",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\n",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;
}

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

 

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

标签:原因   pac   name   warnings   变量   %s   构造   obj   申请   

原文地址:https://www.cnblogs.com/weiyouqing/p/9656924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!