作者:几冬雪来
时间:2023年5月2日
内容:C++类和对象内容讲解
目录
前言:
1.拷贝构造:
2.运算符重载:
结尾:
在上一篇博客当中,我们初步的认识和讲解了C++中的类和对象板块的知识。在今天的这一篇中,我们将继续对类和对象的知识进行学习。
在上一篇博客中我们列举出来了两种默认成员函数,今天我们来讲一讲拷贝构造。首先拷贝构造和构造函数等一样也是特殊的成员函数。
其次,拷贝构造函数是构造函数的一种重载形式。
但是在这里,我们的拷贝构造有一些规定:只有单个形参,形参是对本类类型对象的引用,在用已存在的类类型创建新对象时由编译器自动调用。
在C++规定了:
内置类型直接拷贝。
自定义类型需要调用拷贝构造完成拷贝。
因为内置类型拷贝和自定义类型拷贝的不同,这可能会使在我们书写出现一些错误。
类似以上的这种情况,在我们写代码的过程中也是十分的常见,因为拷贝构造的原因,看起来我们会生成一个无止境的数据。
但是其实在这里编译器会对其进行检查。
那么能不能解决这个问题呢?当然是可以的,这里最实用的方法就是指针和引用。
因为我们已经学习了比指针更为方便的引用,所以在这里我们用其对代码进行修改。
这样子书写就没有拷贝构造的存在了。
同时在这里,我们一般会在Data之前加入const防止d1的内容被修改。
这里可以预防我们的d1的内容被d2修改,并且d2本身不变。因为const的加入,权限被缩小了,我们可以及时的检查出来。
同样的,如果在这里如果我们未定义的话,编译器会生成默认的拷贝构造函数。
只不过内容的执行不一样。
在这里我们的内置类型和自定义类型都有被进行处理的。
在书写年月日的代码中,我们可以不写,默认生成的拷贝构造就可以使用。
但是在我们的栈中,需要有指针指向的情况下会不会进行拷贝操作呢?
这里的答案是会的,可以看见我们成功的进行了拷贝的操作,但是这却不是我们想要的结果。通过调试可以看出来,这个地方我们的st2和st1指向了同一块地址。
这样子就会导致一个问题。
析构的时候我们这里先析构st2,再析构st1。但是因为它们指向了同一块地址,所以这也代码我们的同一块空间被释放了2次。
这种操作也被我们称为——浅拷贝。
因此这个地方就要用到——深拷贝,去解决这个问题了。
因此这种情况下,我们就必须要自己去实现深拷贝。
这里我们就大概知道,在我们拷贝的过程中,能够使用引用就尽量使用引用操作。
但是凡事都有例外。
像这种情况,在出作用域之后,我们临时变量的那块空间就会被析构掉,空间就会归还给编译器并且置空。
但是因为引用的原因,所以在返回的时候,我们依旧去寻找那块空间,这个时候就找不到了,即使找到也被置空了。
在这里我们依靠什么的代码为根据。
使用上面的代码来比较两个日期的大小是这么做的?
这里就是我们比较两个日期的方式,这种方法我们可以比较出来两个日期的大小。
不过在返回的时候,因为这个地方我们返回的类型是bool类型,因此这里可能会导致我们代码的可读性变差。
毕竟最后打印出来的值不是1就是0,如果不看代码的话,我们很难清楚里面在干什么?
这里就要提出一个问题:
为什么内置类型可以直接比较,自定义类型不能直接比较?
答案是因为在编译器中,内置类型是已经被定义好的了,因此知道怎么进行比较。而自定义类型是我们定义的,编译器不知道怎么比较。
因为这里我们就要用到操作符重载——operator+符号。
那么在这里我们先将其书写出来,下一篇博客再来仔细讲解它。
在这个地方,我们就可以通过main函数看出来它是比较的d1和d2的大小。
这里就可以增强我们的可读性。
到这里我们的类和对象板块的知识就有了一个更加深入的了解,要学习好C++,类和对象是我们必须要跨过去的坎,只有这样在后面我们学习的过程才会比较轻松。最后希望这篇博客可以为大家带来帮助。