深拷贝和浅拷贝以及初始化类属性

2021-07-29  本文已影响0人  Sheik

环境:ide:Mac+clion

视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5

为什么要做深拷贝:

class Person {
public:
    Person(){
        cout << "默认构造函数"<<endl;
    }

    Person(int age,int height){
        m_Age = age;
        m_Height = new int(height);
        cout << "有参构造函数!"<<endl;
    }

    ~Person(){
        if(m_Height != NULL){
            delete m_Height;
            m_Height = NULL;
        }
        cout << "析构函数执行"<<endl;
    }
    Person(const Person &p) {
        this->m_Age = p.m_Age;
        //this->m_Height = p.m_Height;//默认copy构造函数就是这样做的。 如果属性创建在堆之上,这里就不能这样做。
        this->m_Height = new int(*p.m_Height);//这样就完成了深度copy的动作。这里堆m_Height重新赋值新的地址和堆空间。每个对象分别释放内存。
        cout << "copy 构造函数执行!" << endl;
    }


    int m_Age;//年龄
    int *m_Height;//身高
};
//在main中或者方法中执行下面的代码
Person p(1,2);
Person p2(p);//如果是浅copy,
    // 也就是编译器提供的copy构造函数,这里就会报错。因为析构函数已经调用析构函数里面清除堆内存的操作。清空内存。
//    这里需要做深copy,什么叫做深copy,也就是需要重写copy 构造函数。

结论:

浅copy:就是编译器提供的copy构造函数
深copy:在堆区申请的空间进行copy操作。 每一个对象针对堆中申请的数据重新申请一块地址,copy一份。

如果属性存在堆空间获取的内存,那么就需要自己重写copy构造函数。来解决浅copy带来的问题。

初始化属性

class Person{

public:
    //传统的初始化方式
//    Person(int a,int b,int c){
//        m_A = a;
//        m_B = b;
//        m_C = c;
//    }
    Person():m_A(10),m_B(20),m_C(30){
        // 通过这种方式进行初始化属性。
    }

    Person(int a,int b,int c):m_A(a),m_B(b),m_C(c){
        // 通过这种方式进行初始化属性。
    }
    int m_A;
    int m_B;
    int m_C;
};

//在main函数中执行:
//    Person person(1,2,3);
//    cout << person.m_A<<endl;
     Person p;
    Person person(1,2,3);
     cout << person.m_A<<endl;
上一篇 下一篇

猜你喜欢

热点阅读