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

Posted 黑马程序员教程

tags:

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

初学C++时,深拷贝与浅拷贝绝对是一个理解上的麻花团,十个童鞋7个理解不了,鉴于童鞋们总在这个坑里爬不出来,今天呢,小编就专门写一写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();

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


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


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


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



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); //装修}

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


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


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


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


关于深拷贝与浅拷贝呢,今天我们就讲到这里,如果想进行更深入的学习,请关注黑马程序员参与更多互动。


求点赞、求好看、求分享


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

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

如何写出优秀的代码?设计模式六大原则告诉你

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

DBA神级操作:我是如何将工作“合理分摊”给开发?

可怜的男孩

什么是多态性,C++中是如何实现多态的