美文网首页
深拷贝和浅拷贝以及初始化类属性

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

作者: Sheik | 来源:发表于2021-07-29 22:55 被阅读0次

环境: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;

相关文章

  • JAVA设计模式:原型模式与拷贝

    深拷贝与浅拷贝 浅拷贝:对象A进行赋值操作得到对象B,这就是浅拷贝,修改对象A的属性会影响到B的属性 深拷贝:深拷...

  • js浅拷贝、深拷贝

    前言 本文主要简单讲一下什么是浅拷贝、什么是深拷贝、深拷贝与浅拷贝的区别,以及怎么进行深拷贝和怎么进行浅拷贝。 一...

  • Java基础 - 深拷贝和浅拷贝

    Java 的深拷贝和浅拷贝 什么是深拷贝、浅拷贝 (深克隆、浅克隆)? 在 Java 中,数据类型分为 基本数据类...

  • 深拷贝、浅拷贝

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • 面试题整理

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

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

    环境:ide:Mac+clion 视频链接:https://www.bilibili.com/video/BV1H...

  • 面试 (一) : 基础篇

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。• 深拷贝同浅拷贝的区别:浅拷...

  • 基础

    1、父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅...

  • 常见的面试(一)

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。• 深拷贝同浅拷贝的区别:浅拷...

网友评论

      本文标题:深拷贝和浅拷贝以及初始化类属性

      本文链接:https://www.haomeiwen.com/subject/ingfvltx.html