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