很多人都不知道的小秘密,c++中拷贝分为两种

在这里插入图片描述

深拷贝与浅拷贝

下面为作者的总结以深刻理解深拷贝和甜拷贝
深拷贝:如果创建类对象时,相应的构造函数内用运算符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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值