深拷贝与浅拷贝
下面为作者的总结以深刻理解深拷贝和甜拷贝
深拷贝:如果创建类对象时,相应的构造函数内用运算符new为对象的数据成员申请内存空间,那么在析构函数中应该用运算符 delete释放相应的内存空间。
当创建对象并用已经存在的对象进行初始化时,必须自定义拷贝构造函数。
在拷贝构造函数内使用new运算符为新对象申请内存空间,把已经存在的对象的内存空间中的数据拷贝到新对象申请的内存空间中,这种拷贝过程即称为深拷贝。
浅拷贝:与深拷贝的概念相对应,不采用上述深拷贝方法实现对象的拷贝即称为浅拷贝。
通常情况下,如果类的构造函数内没有用new运算符为对象的数据成员申请内存空间,析构函数中也不用 delete运算符释放内存空间,则不需要自定义拷贝构造函数,使用编译器提供的默认拷贝构造函数即可。
下为深拷贝的代码案例:
#include <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#include <array>
using namespace std;
class student {
public:
student (const string & = " ", int = 19, double = 0, double = 0, double = 0);
student (const student &);
~student ();
double avgscore();
private:
string strname;//描述学生姓名
int age;//描述学生年龄
double *score;//指针,用来储存三门课的成绩
};
//实现构造函数
student::student(const string &name, int nage, double nmath, double neglish, double npe) {
strname = name;
age = nage;
score = new double[3];
score[0] = nmath;
score[1] = neglish;
score[2] = npe;
}
//实现折构函数
student::~student() {
delete []score;
}
student::student(const student &s) {//实现拷贝构造函数
strname = s.strname;
age = s.age;
score = new double [3];//为当前对象score申请内存空间
score[0] = s.score[0];
score[1] = s.score[1];
score[2] = s.score[2];
}
double student::avgscore() {
return (score[0] + score[1] + score[2]) / 3;
}
int main() {
student s1{"janni", 23, 45.5, 78.7, 95.2};
cout << s1.avgscore() << endl;
student s2{s1};
cout << s2.avgscore() << endl;
}