C++深拷贝的浅拷贝

Posted boyboy

tags:

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

 

  • class  person

    public:
    person(int age,int height)

    m_age=age;
    m_height=new int(height);//new一个堆区接受外来值与成员变量地址一致
    cout<<"有参构造函数"<<endl;

    ~person()//析构函数将堆区的数据释放

    if(m_height!=NULL)

    delete m_height;
    m_height=NULL;

    cout<<"析构函数"<<endl;

    int m_age;
    int *m_height;
    ;
    void text01()

    person p1(10,20);
    cout<<"年龄为"<<p1.m_age<<"身高为"<<p1.m_height<<endl;
    person p2(p1);
    cout<<"年龄为"<<p2.m_age<<"身高为"<<p2.m_height<<endl;

    int main()
    text01();
  • 当调用析构函数时由于,p2的拷贝函数和p2的构造函数同时对同一份地址进行析构产生错误

  • 修改系统自动给出的拷贝构造,在有参构造下应自己实现拷贝构造函数

  • //深拷贝
    person(const person *p)

    //m_height=p.m_height;系统自动给出
    m_height=new int (*p.m_height);

初始化列表

  • class person

    public:
    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;
    ;
    void text01()

    person p(10,25,66);
    cout<<p.m_a<<p.m_b<<p.m_c<<endl;

    int main()
    text01();
  • 类对象作为类成员

    • class phone

      public:
      phone(string pname)

      m_pname=pname;

      string m_pname;
      ;
      class person

      public:
      person(string name,string pname):m_name(name),m_pname(pname)

      string m_name;
      phone m_pname;
      ;
      void test()

      person p("小子","苹果max");
      cout<<"姓名"<<p.m_name<<"手机为"<<p.m_pname.m_pname<<endl;

      int main()

      test();
  • 静态成员

    • class person

      public:
      static int age;//类内声明
      private:
      ;
      int person::age=10;// 类外初始化
      void text01()

      //用对象进行访问
      person p1;
      cout<<p1.age<<endl; //输出的结果是10
      person p2;
      cout<<p2.age<<endl;//输出的结果是10
      //通过类名进行访问
      cout<<person::age<<endl;

      int main()

      text01();
      system("pause");
      return 0;
    •  

js的浅拷贝与深拷贝

浅拷贝和深拷贝只针对对象和数组这样的数据类型,对于基本的数据类型不存在这些问题

1、浅拷贝

浅拷贝之后的对象或数组与原对象或数组指向内存中的同一个地址,改变其中任何一个,另一个也会相应的被改变

2、深拷贝

深拷贝之后的对象或数组与原对象和数组的内存地址是独立的,改变任何一个,另一个都不会受影响

数组的深拷贝

var a = [1,2,3];
var b = a.concat();//数组拼接
var c = a.slice(0);//截取数组

对象的深拷贝

手动复制,将属性一个个复制到新对象中,或使用Object.assign()该方法只能复制基本数值的属性,若属性为引用类型,则为浅复制,即这两种方法的处理深度只有一层,没有做到真正的深复制

转成JSON再转回来

var obj1 = {a:1,b:{a:11,b:22}};
var obj2 = JSON.parse(JSON.stringify(obj1))

该方法值适用于JSON格式的对象,而function没有办法转成JSON,该方法只适用于单纯的数据对象

jquery的$.extend方法

lodash中的_.cloneDeep

 

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

C++深拷贝的浅拷贝

C#的浅拷贝和深拷贝

C语言面试题C++中String类引用计数器的浅拷贝写法与深拷贝写法

QImage的浅拷贝与深拷贝

python的浅拷贝和深拷贝

js的浅拷贝与深拷贝