C++——类和对象(3)

作者:几冬雪来

时间:2023年5月2日

内容:C++类和对象内容讲解

目录

前言: 

1.拷贝构造: 

2.运算符重载:

结尾:


前言: 

在上一篇博客当中,我们初步的认识和讲解了C++中的类和对象板块的知识。在今天的这一篇中,我们将继续对类和对象的知识进行学习。 

1.拷贝构造: 

在上一篇博客中我们列举出来了两种默认成员函数,今天我们来讲一讲拷贝构造。首先拷贝构造和构造函数等一样也是特殊的成员函数。 

其次,拷贝构造函数是构造函数的一种重载形式

但是在这里,我们的拷贝构造有一些规定:只有单个形参,形参是对本类类型对象的引用,在用已存在的类类型创建新对象时由编译器自动调用

 

在C++规定了:

内置类型直接拷贝。

自定义类型需要调用拷贝构造完成拷贝。 

 因为内置类型拷贝和自定义类型拷贝的不同,这可能会使在我们书写出现一些错误

  

类似以上的这种情况,在我们写代码的过程中也是十分的常见,因为拷贝构造的原因,看起来我们会生成一个无止境的数据。

但是其实在这里编译器会对其进行检查

那么能不能解决这个问题呢?当然是可以的,这里最实用的方法就是指针和引用

因为我们已经学习了比指针更为方便的引用,所以在这里我们用其对代码进行修改。 

这样子书写就没有拷贝构造的存在了。 

同时在这里,我们一般会在Data之前加入const防止d1的内容被修改。 

这里可以预防我们的d1的内容被d2修改,并且d2本身不变。因为const的加入,权限被缩小了,我们可以及时的检查出来。

同样的,如果在这里如果我们未定义的话,编译器会生成默认的拷贝构造函数

只不过内容的执行不一样。 

在这里我们的内置类型和自定义类型都有被进行处理的。 

在书写年月日的代码中,我们可以不写,默认生成的拷贝构造就可以使用

但是在我们的栈中,需要有指针指向的情况下会不会进行拷贝操作呢

这里的答案是会的,可以看见我们成功的进行了拷贝的操作,但是这却不是我们想要的结果。通过调试可以看出来,这个地方我们的st2和st1指向了同一块地址

这样子就会导致一个问题。 

析构的时候我们这里先析构st2,再析构st1。但是因为它们指向了同一块地址,所以这也代码我们的同一块空间被释放了2次

这种操作也被我们称为——浅拷贝。 

因此这个地方就要用到——深拷贝,去解决这个问题了。

因此这种情况下,我们就必须要自己去实现深拷贝

这里我们就大概知道,在我们拷贝的过程中,能够使用引用就尽量使用引用操作

但是凡事都有例外。

像这种情况,在出作用域之后,我们临时变量的那块空间就会被析构掉,空间就会归还给编译器并且置空

但是因为引用的原因,所以在返回的时候,我们依旧去寻找那块空间,这个时候就找不到了,即使找到也被置空了。 

2.运算符重载:

在这里我们依靠什么的代码为根据。

使用上面的代码来比较两个日期的大小是这么做的? 

这里就是我们比较两个日期的方式,这种方法我们可以比较出来两个日期的大小

不过在返回的时候,因为这个地方我们返回的类型是bool类型,因此这里可能会导致我们代码的可读性变差。

毕竟最后打印出来的值不是1就是0,如果不看代码的话,我们很难清楚里面在干什么

这里就要提出一个问题:

为什么内置类型可以直接比较,自定义类型不能直接比较? 

答案是因为在编译器中,内置类型是已经被定义好的了,因此知道怎么进行比较。而自定义类型是我们定义的,编译器不知道怎么比较。 

因为这里我们就要用到操作符重载——operator+符号。 

那么在这里我们先将其书写出来,下一篇博客再来仔细讲解它。 

在这个地方,我们就可以通过main函数看出来它是比较的d1和d2的大小。 

这里就可以增强我们的可读性

结尾:

到这里我们的类和对象板块的知识就有了一个更加深入的了解,要学习好C++,类和对象是我们必须要跨过去的坎,只有这样在后面我们学习的过程才会比较轻松。最后希望这篇博客可以为大家带来帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值