类和对象(跑路人笔记)<完>(2)

简介: 类和对象(跑路人笔记)<完>

类的6个默认生成函数

类如果是个空类我们的编译器,也会生成6个默认的函数并在符合条件的情况下自己调用.这些函数包括

构造函数,析构函数,拷贝构造,赋值重载,两个取地址重载

这6个函数都是我们可以进行改造的并且在使用的时候编译器会自己调用,非常舒服.


image.png


构造函数

比如我们现在创建了一个日期型类,我们想对其进行初始化,但是如果我们只是写了个初始化的函数我们还需要每次使用都调用,非常不方便.


而我们的构造函数作为一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。


值得注意的是,虽然名字叫构造函数但是他跟对象实例化构造没啥关系,构造函数就只管给成员附上值.


特性

函数名与类名相同。


无返回值。 (且不是void而是没有返回的类型)


对象实例化时编译器自动调用对应的构造函数。


构造函数可以重载。


因为可以重载所以可以创建多个来方便我们使用


在类被其他类引用是构建函数是会被调用.

class date
{
public:
    //构造函数
  date(int year = 2002, int month = 8, int day = 26)
  {
  _year = year;
  _month = month;
  _day = day;
  }
    //打印函数
  void Print()
  {
  cout << _year << "_" << _month << "_" << _day << endl;
  }
private:
  int _year;
  int _month;
  int _day;
};
int main()
{
  date a;
  a.Print();
  return 0;
}



上面代码实现的结果如下图:


image.png


我们这样创建的构造函数是可以传参的


传参形势如下:


image.png


上面的构造函数我们使用了全缺省,但是如果我们不使用全缺省会发生什么呢?


我们将构造函数改成下面形势


image.png


改成上面形势后就会报下面的错误说我们没有默认构造函数使用.


那么什么可以成为默认构造函数呢?


image.png


[第五点介绍](# 特性)第五点的意思直接看图吧=.=


首先建立一个测试类并搭建好他的构建函数


image.png


在另一个类中使用测试类


image.png


来看看我们测试类的构造函数有没有被调用


image.png


调用了.


默认构造函数

直接告诉大家: 只有全缺省,无参,编译器自动生成的可以做默认构造函数,一个类没有默认构造函数并且没有传参的话是实例化出对象的.


但是如果没有默认构造函数,只要传参得当也是可以实例化出对象的.


比如下面的半缺省.


image.png

image.png




不过我们在搭建默认构造函数的时候还是使用全缺省较好.


而且全缺省的函数和无参不能同时出现,不然我们在使用的时候编译器无法识别.


注意: 我们类成员变量在取名的时候最后前面加上_(不同公司规定不同,反正最好不要直接使用对应名称如year,不然可能会出现以下情况)


image.png


因为我们的编译器的this指针是编译器自己调用的,并不是十分智能,所以我们最好还是在前面加上_或者在其他地方加上标识.


也可以用this指针来弄,不过给人感觉怪怪的=.=


析构函数

概念


析构函数也不是将类内成员都销毁那是编译器干的事情,析构函数是在对象的生命结束要被销毁的时候自动调用的函数,比如我们的栈类要向堆区要空间,我们就可以在此处进行归还


特征


析构函数名是在类名前加上字符 ~.

无参数无返回值.

一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数.

对象生命周期结束时,C++编译系统系统自动调用析构函数.

在当类一中有其他类的时候,类一的对象在被销毁前会调用其他类的析构函数.

来个例子看看吧


class Stack
{
public:
  //构造函数
  Stack()
  {
  _data = (int*)malloc(sizeof(int) * 4);
  _top = 0;
  _capacity = 4;
  }
  //析构函数
  ~Stack()
  {
  free(_data);
  _top = 0;
  _capacity = 0;
  }
private:
  int* _data;
  int _top;
  int _capacity;
};




拷贝构造函数

概念


用于将一个相同类型的对象内容拷贝到另一个对象中,只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。


如果是已存在的拷贝到已存在的是


举例如下


class date
{
public:
    //构造函数
  date(int year = 2002, int month = 8, int day = 26)
  {
  _year = year;
  _month = month;
  _day = day;
  }
    //拷贝构造函数
  date(const date& c)//也是构造函数的重载
  {
  _year = c._year;
  _month = c._month;
  _day = c._day;
  }
    //打印函数
  void Print()
  {
  cout << _year << "_" << _month << "_" << _day << endl;
  }
private:
  int _year;
  int _month;
  int _day;
};



这样我们对另一个对象进行初始化时就可以直接传来对象了.


image.png


在初始化时使用=赋值也可以调用到拷贝构造函数


image.png


其实我们不写拷贝构造函数我们的编译器也会给我们生成一个,自己生成的拷贝构造函数在浅拷贝的时候完全够用了,当我们需要深拷贝的时候就可以自己写.


深拷贝

既然我们不写拷贝构造函数编译器会自动生成一个用于浅拷贝的,为啥还要有呢?


主要是因为我们要写深拷贝.


深拷贝就是我们在实现的时候注意一下,不能简单通过赋值操作来拷贝的需要深拷贝一下.


比如指针等.


我们比如我们使用Stack类的时候需要从堆区拿空间,就需要指针来保存变量,如果我们使用浅拷贝就会造成free两次的警告,而且在使用的时候也十分诡异.


所以我们要专门写个拷贝构造函数来达到深拷贝的目的.


比如我们的Stack类的.


Stack(const Stack& s)
  {
  _data = (int*)malloc(sizeof(int) * (s._capacity));
  memcpy(s._data, _data, sizeof(int) * s._capacity);
  _capacity = s._capacity;
  _top = s._top;
  }



我们的这些默认生成的函数都可以自己实现,只要自己记住他们的格式就好.


其中取地址重载等函数都可以实现但是,没必要编译器的实现以及足够我们使用了.


相关文章
|
消息中间件 Java 网络安全
JAVAEE分布式技术之Zookeeper的第一次课
JAVAEE分布式技术之Zookeeper的第一次课
594 0
|
7月前
|
人工智能 JavaScript Java
如何在IDEA中借助深度思考模型 QwQ 提高编码效率?
通义灵码目前已经支持 QwQ-plus 模型,欢迎大家在【智能问答】里,选择切换模型,即可体验更小尺寸、更强性能的新模型!
219 10
|
消息中间件 存储 数据库
深入学习RocketMQ的底层存储设计原理
文章深入探讨了RocketMQ的底层存储设计原理,分析了其如何通过将数据和索引映射到内存、异步刷新磁盘以及消息内容的混合存储来实现高性能的读写操作,从而保证了RocketMQ作为一款低延迟消息队列的读写性能。
|
10月前
|
人工智能 小程序 UED
【一步步开发AI运动小程序】十六、AI运动识别中,如何判断人体站位?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,本地引擎无需后台支持,具备快速、体验好、易集成等优势。本文介绍如何利用插件的`camera-view`功能,通过检测人体站位视角(前、后、左、右),确保运动时的最佳识别率和用户体验。代码示例展示了如何实现视角检查,确保用户正或背对摄像头,为后续运动检测打下基础。
|
网络协议 Unix 网络安全
FTP服务器怎么搭建?Windows server搭建FPT服务器
FTP服务器是按照FTP协议提供文件传输服务的计算机。它用于在两台计算机间安全地传输文件,支持用户权限管理和跨平台操作。FTP使用控制连接处理命令,数据连接传输文件,有PORT和PASV模式。要搭建FTP服务器,首先在Windows Server 2008 R2上安装IIS,确保选中FTP服务。接着,创建FTP文件夹作为站点根目录,通过IIS管理器添加FTP站点,配置站点信息、身份验证和权限。测试客户端通过telnet和浏览器访问FTP服务器,确认能成功登录及浏览文件。FTP常用于文件共享和管理,可通过专用工具如FlashFXP上传下载文件。
546 0
FTP服务器怎么搭建?Windows server搭建FPT服务器
WXM
|
Java 应用服务中间件 网络安全
Eclipse运行SSM/SSH项目教程
Eclipse运行SSM/SSH项目教程
WXM
484 0
|
机器学习/深度学习 监控 算法
深度学习赋能现代智能监控:图像识别技术的突破与应用
【4月更文挑战第8天】 在数字时代,智能监控系统作为城市安全和高效管理的关键组成部分,其发展受到了广泛关注。本文聚焦于基于深度学习的图像识别技术在智能监控领域的应用,探讨了该技术如何提升监控系统的自动化和智能化水平。通过对卷积神经网络(CNN)、循环神经网络(RNN)等深度学习模型的研究,分析了其在实时目标检测、行为识别和异常行为分析中的具体应用。文章还讨论了这些技术在实际部署中遇到的挑战,如数据隐私保护、算法优化和系统集成等问题,并提出了相应的解决策略。
|
缓存 监控 JavaScript
vue从安装到熟练 2022流畅无痛版(第一季:入门篇)
该文章是《vue从安装到熟练 2022流畅无痛版》系列的第一季入门篇,介绍了Vue的基本概念、环境配置、项目创建与运行,并通过修改HelloWorld.vue和App.vue文件内容展示了如何在页面上显示"Hello World",最后还提供了Vue官方文档链接和介绍了Vue的常用内置指令和模板语法等基础知识。
vue从安装到熟练 2022流畅无痛版(第一季:入门篇)
|
存储 人工智能 网络协议
编程入门(二)【计算机基础一】
编程入门(二)【计算机基础一】
79 0
|
监控 安全 Cloud Native
高性能数据访问中间件 OBProxy(七):安全、协议和监控
经过本系列前六篇文章的分布式特性介绍,相信大家已经了解了 OBProxy 在 OceanBase 数据库整体架构下的作用。本篇文章我们将换一个视角,介绍一些偏“中间件”的功能:安全、协议和监控功能。从 OBProxy 整体来看,安全、协议和监控属于产品层,因此更加贴近用户和开发者,大家了解起来比较容易,我们用一篇文章来统一介绍。1. 安全功能OBProxy 的安全功能和 OBProxy 的使用场景
304 78
高性能数据访问中间件 OBProxy(七):安全、协议和监控