zoukankan      html  css  js  c++  java
  • 对浅拷贝和深拷贝的基本理解

    浅拷贝就是成员一 一赋值,是编译器默认的对类的赋值操作,

    但是有一种情况会出错::如果赋值的是一个指针怎么办?

    赋值的是指针时,两个类成员的指针就指向同一块空间!

    对一个指针内容的操作会影响到另一个对象,这可能引起意料之外的错误!

    #include <bits/stdc++.h>
    using namespace std;
    class aa
    {
    public:
        char *p;                //创建的对象中有指针
        aa(){p=new char[10];}
       ~aa() {(delete []p);}
    };
    int main()
    {
        aa a;
        strcpy(a.p,"you");    
        aa b=a;                   //进行浅拷贝,也就是一一赋值
        cout<<a.p<<endl;
        cout<<b.p<<endl;    
    //输出结果为 you  you
    
        strcpy(b.p,"me");
        cout<<a.p<<endl;
        cout<<b.p<<endl;
    //输出结果为  me   me
    
        return 0;
    }                
    

      可见:浅拷贝把两个对象的指针都指向了一个地址,牵一发而动全身

    再来看看浅拷贝的类中没有指针的情况

    #include <bits/stdc++.h>
    using namespace std;
    class aa
    {
    public:
        char ch;
    };
    int main()
    {
        aa a;
        a.ch='A';                  //创建对象,初始化,浅拷贝
        aa b(a);
    
        cout<<a.ch<<endl;
        cout<<b.ch<<endl;
    //output: A   A
    
        b.ch='B';//修改对象b
         cout<<a.ch<<endl;
        cout<<b.ch<<endl;
    //output: A    B
        return 0;
    }
        
    

      可见:没有指针的对象使用浅拷贝不会出现上面的问题

    总的来说,对含有指针的对象使用浅拷贝会出现以下几种错误:

    1:指针牵一发而动全身,对一个指针对象的修改导致另一个对象也被修改

    2:析构函数会多次清空同一块堆内存

    3:对一个对象堆内存delete  会导致另一个对象的 这块空间消失,使指针访问不到这块本改能访问的空间

    在使用时,如果对象中没有指针,放心使用浅拷贝,毕竟简单,一旦出现与指针相关的,必须要写个深拷贝了

    落霞与孤鹜齐飞,秋水共长天一色
  • 相关阅读:
    绑定方式开始服务&调用服务的方法
    采用服务窃听电话示例
    后台服务运行示例
    Android短信监听器——示例
    利用广播实现ip拨号——示例
    Android图片的合成示例
    IIS 7.5 发布Web 网站步骤
    C# 中 多线程同步退出方案 CancellationTokenSource
    UML 类图常用表示方法.
    Socket Receive 避免 Blocking
  • 原文地址:https://www.cnblogs.com/star-and-me/p/6682787.html
Copyright © 2011-2022 走看看