目录
什么是浅拷贝
所谓的浅拷贝就是由系统默认的拷贝构造函数对数据成员进行逐一的赋值,通常默认的拷贝构造函数就是可以达到该效果的,但是如果类中有指针类型的数据,那么此时的浅拷贝就会带来错误
下面我们来看一个由于浅拷贝中带有指针数据所引发错误的例子
下面会用到new 和delete的方法我先来讲解一下
new 和delete的使用方法
在c++中,new和delete是用来分配内存和释放内存的两个操作符,正如c中的malloc和free一样。因为malloc、calloc、realloc都是在堆上分配的,堆上分配的空间必须由用户自己来管理,如果不释放,就会造成内存泄漏。而栈上分配的空间是由编译器来管理的,具有函数作用域,出了函数作用域后系统会自动回收,不由用户管理,所以不用用户显式释放空间。
因此,如果你的函数里面声明指针的时候没有用到new来申请内存。就不用delete了。
浅拷贝的实例
#include <iostream> #include <string> using namespace std; class Score { private: char *name; float score; public: Score(char *name1,float score1); //创建一个自定义的构造函数 ~Score(); //首先声明一个析构函数 }; Score::Score(char *name1, float score1) { cout << "我是构造函数,现在已执行……" << name1 << endl; name = new char[strlen(name1) + 1]; if(name != 0){ strcpy(name,name1); score = score1; } } Score::~Score() { cout << "对象注销,现在自动执行析构函数了……" << name << endl; name[0] = '\0'; delete[]name; } int main() { Score score1("周周", 100); Score score2 = score1; return 0; }
该程序的输出结果是会报错的,程序开始运行的时候我们就创建score1对象就调用构造函数
用new运算符从内存中动态分配了一块内存,并且name指向这个内存块,因为我们没有定义拷贝构造函数,所以程序就自动将score1的所有数据成员一一赋值给了score2,这就使得这两个对象的数据成员的都是指向同一个内存,但是当第一个对象生命周期结束时,它相应的内存就被释放了,但是第二次对象score2又企图释放同一内存空间,这就导致的同一个内存空间的两次释放,这当然是不允许的,所以必然会引发错误
什么是深拷贝
深拷贝指的就是当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,对象的另开辟一块新的资源,
小结
深拷贝和浅拷贝的区别就是在对象状态中包含其他对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象则是深拷贝,否则是浅拷贝。浅拷贝只是单单的对另对象赋值,而深拷贝则需另开辟一片空间来存放内容。