对浅拷贝和深拷贝的基本理解

时间:2021-01-14 19:48:21

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

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

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

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

#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  会导致另一个对象的 这块空间消失,使指针访问不到这块本改能访问的空间

 

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