对浅拷贝和深拷贝的基本理解
浅拷贝就是成员一 一赋值,是编译器默认的对类的赋值操作,
但是有一种情况会出错::如果赋值的是一个指针怎么办?
赋值的是指针时,两个类成员的指针就指向同一块空间!
对一个指针内容的操作会影响到另一个对象,这可能引起意料之外的错误!
#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 会导致另一个对象的 这块空间消失,使指针访问不到这块本改能访问的空间
在使用时,如果对象中没有指针,放心使用浅拷贝,毕竟简单,一旦出现与指针相关的,必须要写个深拷贝了
落霞与孤鹜齐飞,秋水共长天一色

浙公网安备 33010602011771号