深拷贝,浅拷贝

来源:互联网 发布:java 运行lua 编辑:程序博客网 时间:2024/05/16 06:32
参考链接:http://www.cnblogs.com/BlueTzar/articles/1223313.html
 
    深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。
     如普通类型对象的复制操作int a = 10;int b = a;就是浅拷贝。
     而类对象就存在深拷贝和浅拷贝的问题,在说明深拷贝与浅拷贝之间的区别之前,有必要了解类对象复制的几种情况,如:
class Example{
private:
     int a;
public:
     Example(int b)
     {
          a = b;
     }
}
int main()
{
     class Example A(100);
     class Example B;
     B = A;
}
此时虽然B.a也是100,但是这是一种浅拷贝。系统是调用了拷贝构造函数。
     拷贝构造函数是在以下三种情况会调用的函数
一个对象以值传递的方式传入函数体 
一个对象以值传递的方式从函数返回 
一个对象需要通过另外一个对象进行初始化。
     形式如下:
Example(const Example &b)
{
     a = b.c;
}
     与普通构造函数一样,函数名必须与类名相同。但是参数是一个同类的常量对象的引用。
     如果类中没有显示的声明一个拷贝构造函数,编译器会分配一个拷贝构造函数,执行对象之间的位拷贝,将对象里的值完全复制给另一个对象(包括指针)。但是这存在一个缺点,如果类内成员变量需要动态开辟堆内存,如:A=B,则A中变量和B中变量指向同一块内存,如果B被析构了,则A中的指针就指向空地址,导致错误。所以在需要做深拷贝时自定义拷贝构造函数是很必要的。
     深拷贝和浅拷贝最明显的区别在于,如果一个类拥有资源,当这个类的对象发生复制过程的时候,需要重新分配,则是深拷贝,否则就是浅拷贝,编译器分配的构造函数式浅拷贝。
原创粉丝点击