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

it2022-05-09  20

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

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

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

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

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

 

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

转载于:https://www.cnblogs.com/star-and-me/p/6682787.html


最新回复(0)