zoukankan      html  css  js  c++  java
  • [C/C++] 深拷贝和浅拷贝

    ·默认拷贝构造函数可以完成对象的数据成员值简单地复制-----浅拷贝

    ·对象的数据资源是由指针指示的堆时,默认拷贝构造函数仅作指针值的复制,需要显式定义拷贝构造函数-----深拷贝

    首先定义几个点:

    Point p1("home",1.0,2.0),p2("school",3.0),p3;

    Point p1("home",1.0,2.0),p2("school",3.0),p3;
    Point p4 = p1;

    浅拷贝:

    深拷贝:

    自定义的拷贝构造函数:

     1 Point::Point(Point &p):x(p.x),y(p.y)
     2 {
     3     if(p.name)
     4     {
     5         name=new char[strlen(p.name)+1];
     6         strcpy(name,p.name);
     7     }
     8     else
     9     {
    10         name=new char[8];
    11         strcpy(name,"no name");
    12     }
    13     cout<<name<<"  copy constructing”;
    14     }

    注:若是浅拷贝,当p1先执行析构函数之后,name所指向的内存被释放掉;当p4再执行析构函数的时候,由于p1和p4中的name指向的是同一块地址空间,因此会因为对同一块地址释放两次内存而报错。但深拷贝就没有这个风险。

    标记拷贝构造

    对于深拷贝,需要把资源复制一份,而有时候资源很大,复制需要大量的时间和空间,甚至有些资源是不可复制的,这时深拷贝是不可取的,为此,可以选择带标记的拷贝构造。

    原理:通过一个标志位flag来确定当前对象是拷贝生成的还是构造生成的;在析构函数中对拷贝生成的对象不释放额外资源,原始生成的对象析构时才能释放额外资源,从而解决了同一个资源空间被释放多次的问题。

  • 相关阅读:
    day 01
    day14
    day12
    day13
    day11
    day9
    day10
    day08
    day07
    day06
  • 原文地址:https://www.cnblogs.com/lca1826/p/6505964.html
Copyright © 2011-2022 走看看