如何给两个儿子合理分房产?C++会告诉你答案
Posted 黑马程序员教程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何给两个儿子合理分房产?C++会告诉你答案相关的知识,希望对你有一定的参考价值。
初学C++时,深拷贝与浅拷贝绝对是一个理解上的麻花团,十个童鞋7个理解不了,鉴于童鞋们总在这个坑里爬不出来,今天呢,小编就专门写一写C++中的深拷贝与浅拷贝。
1
浅拷贝
首先我们来看一下浅拷贝,所谓浅拷贝呢,顾名思义就是拷贝的比较浅,这个“浅”字怎么理解呢,下面先举个“栗子”。
比如,一户人家有两个儿子,两个儿子要结婚,那首先呢大儿子先结婚,结婚先得买房子呀,那买了房子给大儿子成了家,接着就是小儿子结婚,小儿子结婚,一应规格按照大儿子操办,但是问题来了,没钱买第二套房子,就让小儿子与大儿子共用一套房子,那这到最后必须要干仗呀。
这个呢,就是典型的浅拷贝,一应规格按照别人的拷贝,但不能占人家东西呀。
有这个例子,这浅拷贝呢就好理解了,来一个“官腔”说法就是,当一个类中有指针类型的数据,浅拷贝呢就是将新对象(比如小儿子)指向原有对象(比如大儿子)的内存空间(就是房子),并没有为新对象的指针成员分配新空间(不给买房),这就是浅拷贝。
下面上代码(先给大儿子买房结婚)。
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;
}
(左右滑动即可查看完整代码)
给大儿子买房结婚,完全没有问题,不信看运行结果。
好了,现在问题来了,小儿子也要结婚,并且结婚规格按照大儿子操办,要拷贝人家。在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); //装修
}
(左右滑动即可查看完整代码)
这样再运行程序,就不会报异常了。因为两个对象(两个儿子)各有独立空间(房子),就不报异常了。
总的一句话,深拷贝与浅拷贝的区别就是,深拷贝可以按照已有对象的规格为新对象分配独立的内存空间,而浅拷贝呢,只是完成了指针的拷贝,新对象与已有的对象共有一块内存空间。
当类中没有指针类型的成员变量时,浅拷贝就可以解决所有拷贝问题,但当类中有指针类型的成员变量时,要执行拷贝操作时,必须使用深拷贝。
关于深拷贝与浅拷贝呢,今天我们就讲到这里,如果想进行更深入的学习,请关注黑马程序员参与更多互动。
求点赞、求好看、求分享
以上是关于如何给两个儿子合理分房产?C++会告诉你答案的主要内容,如果未能解决你的问题,请参考以下文章
家庭房产纠纷 父母没有离婚,父亲又和另外一个女人生活,请问房产怎么分配