独家 | 如何给两个儿子合理分房产?C++会告诉你答案

Posted 传智播客院校邦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了独家 | 如何给两个儿子合理分房产?C++会告诉你答案相关的知识,希望对你有一定的参考价值。

传智教育院校邦

全面服务、资源分享、学习交流



初学C++时,深拷贝与浅拷贝绝对是一个理解上的麻花团,鉴于很多老师跟小编反馈,在教学过程中很多学生经常混淆这两个概念。今天呢,小编就专门写一写C++中的深拷贝与浅拷贝,便于老师们跟学生举例讲解。


独家 | 如何给两个儿子合理分房产?C++会告诉你答案



1


浅拷贝


首先我们来看一下浅拷贝,所谓浅拷贝呢,顾名思义就是拷贝的比较浅,这个“浅”字怎么理解呢,下面先举个“栗子”。


比如,一户人家有两个儿子,两个儿子要结婚,那首先呢大儿子先结婚,结婚先得买房子呀,那买了房子给大儿子成了家,接着就是小儿子结婚,小儿子结婚,一应规格按照大儿子操办,但是问题来了,没钱买第二套房子,就让小儿子与大儿子共用一套房子,那这到最后必须要干仗呀。


独家 | 如何给两个儿子合理分房产?C++会告诉你答案


这个呢,就是典型的浅拷贝,一应规格按照别人的拷贝,但不能占人家东西呀。


有这个例子,这浅拷贝呢就好理解了,来一个“官腔”说法就是,当一个类中有指针类型的数据,浅拷贝呢就是将新对象(比如小儿子)指向原有对象(比如大儿子)的内存空间(就是房子),并没有为新对象的指针成员分配新空间(不给买房独家 | 如何给两个儿子合理分房产?C++会告诉你答案),这就是浅拷贝。


下面上代码(先给大儿子买房结婚)。

#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string.h>using namespace std;class Son                //定义儿子类{public:  Son(string name, const char* house);  //声明带参构造函数  void show();              //普通成员函数  ~Son();private:  string _name;               //儿子的姓名  char* _house;              //儿子的房子};Son::Son(string name, const char* house){  cout << "调用构造函数,初始化儿子(为儿子准备结婚房子)" << endl;  _name = name;              //登记姓名  int len = strlen(house) + 1;      //统计所需要房子大小  _house = new char[len];        //买房子  memset(_house, 0, len);        //规划  strcpy(_house, house);          //装修}
void Son::show(){  cout << "看看" << _name << "的房子" << endl;}
Son::~Son(){  cout << "调用析构函数 (比如卖房子)" << endl;  if (_house != NULL)    delete[]_house;}
int main(){  const char* p = "beijing";      //北京的一套房子  Son son1("张三", p);        //给大儿子张三在北京买了一套房子  cout << "son1:";  son1.show();  return 0;}

(左右滑动即可查看完整代码)


给大儿子买房结婚,完全没有问题,不信看运行结果。


独家 | 如何给两个儿子合理分房产?C++会告诉你答案


好了,现在问题来了,小儿子也要结婚,并且结婚规格按照大儿子操办,要拷贝人家。在Son类中新增一个拷贝构造函数。


Son(const Son& another);    //拷贝构造函数


在类外实现这个拷贝构造函数。

Son::Son(const Son& another){  cout << "调用拷贝构造函数
(就是按大儿子规格给小儿子操办婚事)" << endl;  _name = another._name;          //登记姓名(冒充大儿子)  _house = another._house;        //直接把大儿子房子给小儿子}

(左右滑动即可查看完整代码)


在main()函数中追加如下代码。

Son son2(son1);      //直接按大儿子规格操办婚事(房子也用人家的)cout << "son2:(小儿子也要显摆房子,看能不能显摆成)";son2.show();

(左右滑动即可查看完整代码)


这个时候就开始干仗了,拿别人的房子当自己的房子,按自己的风格再装修一遍(数据拷贝),这搁谁谁愿意。再次运行程序,程序就报异常了。



这就是浅拷贝,拷贝别人,却没有拷贝到精髓。



2


深拷贝


看完浅拷贝,那深拷贝就不难理解了,深拷贝就是给两个儿子一人买一套房子,互相独立,谁也不跟谁干仗。翻译成官方的说法就是,深拷贝就是在拷贝构造函数中完成更深层次的拷贝,当类中有指针成员时,深拷贝可以为新对象(小儿子)的指针分配一块内存空间(买房子),将数据复制到新空间(装修房子)。


要实现深拷贝就得修改拷贝构造函数,将上面拷贝构造函数修改一下,修改之后的代码如下所示。

Son::Son(const Son& another){  cout << "调用拷贝构造函数
(就是按大儿子规格给小儿子操办婚事)" << endl;  _name = another._name;      //登记姓名(冒充大儿子)  //_house = another._house;    //直接把大儿子房子给小儿子  int len = strlen(another._house) + 1; //统计一下大儿子房子大小  _house = new char[len];        //给小儿子买一套同样大小的房子  strcpy(_house, another._house);    //装修}

(左右滑动即可查看完整代码)


这样再运行程序,就不会报异常了。因为两个对象(两个儿子)各有独立空间(房子),就不报异常了。


总的一句话,深拷贝与浅拷贝的区别就是,深拷贝可以按照已有对象的规格为新对象分配独立的内存空间,而浅拷贝呢,只是完成了指针的拷贝,新对象与已有的对象共有一块内存空间。


当类中没有指针类型的成员变量时,浅拷贝就可以解决所有拷贝问题,但当类中有指针类型的成员变量时,要执行拷贝操作时,必须使用深拷贝。


END


独家文章推荐(点击文字即可查看):


以上是关于独家 | 如何给两个儿子合理分房产?C++会告诉你答案的主要内容,如果未能解决你的问题,请参考以下文章

家庭房产纠纷 父母没有离婚,父亲又和另外一个女人生活,请问房产怎么分配

独家秘诀|数据库查询lncRNA,我只告诉你一个人

PTA basic 1086 就不告诉你 (15 分) c++语言实现(g++)

可怜的男孩

房产公司如何选择新房报备小程序开发公司

房产公司如何选择新房报备小程序开发公司