当前位置: 首页 > news >正文

【C++】类中的六个默认成员函数(构造函数、析构函数、拷贝构造函数、复制重载函数等)

类中的六个默认成员函数

默认成员函数为了解决C语言存在的一些问题而诞生,默认存在于类中,进行某种操作时会自动调用默认成员函数,如想在此种操作中自动实现某种操作,可以手动定义此默认成员函数,如果手动定义则取代默认成员函数。

一、构造函数

定义对象时会自动调用构造函数,用来进行对象的初始化,构造函数可以进行重载。

默认情况下:

  1. 默认构造函数对内置类型不进行初始化
  2. 对自定义类型,调用此自定义类型的构造函数
class A{			//语法格式
public:A(参数类型1 参数名1,....)  //函数名必须为类名{//默认情况下进行上面两种操作//可自定义为任何想要的操作,一般为初始化类成员变量}
}

定义时自动调用:

在这里插入图片描述

二、析构函数

对象在销毁时会自动调用析构函数,用来销毁此对象。析构函数不能进行重载。

默认情况下:

  1. 默认析构函数对内置类型直接进行回收
  2. 对自定义类型,调用此自定义类型的析构函数

需要注意如果类中存在动态内存开辟的成员,需要手动实现析构函数否则会存在内存泄漏。

class A{			//语法格式
public:~A()		函数名必须为~加类名{//默认情况下进行上面两种操作//可自定义为任何想要的操作,一般为释放在堆空间开辟的内存空间而自定义}
}

对象在函数结束时自动销毁,所以函数结束时会自动对其进行调用:
在这里插入图片描述

三、拷贝构造函数

对象在进行拷贝操作时会自动调用拷贝构造函数,用来拷贝对象。(拷贝构造函数也是构造函数的重载,所以需要注意如果手动实现了拷贝构造函数就必须也手动实现构造函数,否则对象无法初始化)

默认情况下:

  1. 默认对内置类型直接进行浅拷贝
  2. 对自定义类型,调用此自定义类型的拷贝构造

如果类中存在指针或者动态内存开辟,则必须手动实现拷贝构造函数,否则会存在浅拷贝问题。

 class A{            //语法格式
public: A(A& 参数名 )		//函数名为类名,参数类型为类名,且必须用引用的方式,否则会存在无限拷贝问题{//默认情况下进行上面两种操作//可自定义为任何想要的操作,一般为为解决浅拷贝实现}}

下面理解为通过拷贝a1的方式创建对象a2:

在这里插入图片描述

四、赋值重载函数

对象在进行赋值操作时会自动调用赋值重载函数,用来给对象进行赋值。

默认情况下:

  1. 默认对内置类型直接进行赋值
  2. 自定义类型成员变量需要调用对应类的赋值运算符 重载完成赋值

如果类中存在指针或者动态内存开辟,则必须手动实现赋值重载函数,否则也会存在浅拷贝问题。

  • 拷贝构造函数和复制重载函数实现的内容很像却有本质不同,拷贝构造函数是用于对未初始化的存储区进行初始化,而赋值重载函数则是处理一个已经存在的对象。对一个对象赋值,当它一次出现时,它将调用拷贝构造函数,以后每次出现,都调用赋值重载函数。拷贝构造函数只能用在对象的初始化操作中,而赋值重载函数可以用在任何类型的赋值操作中。
class A{
public:A& operator=(const A& a){if (this != &A){_x = a._x;_y = a._y;}int _x;int _y;};int main()
{A a1;A a2;a2 = a1;
}

赋值运算符重载运用方式:

在这里插入图片描述

五、对普通对象取地址重载

此运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容

默认存在形式

class A
{ 
public:A* operator&(){return this ;}
}; 

六、对const对象取地址重载

此运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容

默认存在形式

class A
{ 
public:const A* operator&()const{return this ;}
}; 

img

✨本文收录于C++语法及练习

当你喜欢一篇文章时,点赞、收藏和关注是最好的支持方式。如果你喜欢我的文章,请不要吝啬你的支持,点赞👍、收藏⭐和关注都是对我最好的鼓励。感谢你们的支持!如有问题欢迎指正!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL 数据库基础概念
  • 任务需求准确度量;高效计算任务调度;算力资源统一度量
  • 新火种AI|微软和苹果放弃OpenAI董事会观察员席位
  • Centos新手问题——yum无法下载软件
  • 【两大3D转换SDK对比】HOOPS Exchange VS. CAD Exchanger
  • MongoDB - 集合和文档的增删改查操作
  • 【LeetCode】面试题 16.21. 交换和
  • CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)
  • Clean My Mac X破解版,让您的电脑跟新的一样好用
  • 【栈和队列OJ题】
  • 33 IRF配置思路
  • Python爬虫:BeautifulSoup的基本使用方法!
  • Linux磁盘-创建分区
  • MySQL慢查询日志详解与性能优化指南
  • Mybatis-Plus最优化持久层开发
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Android交互
  • ESLint简单操作
  • Java程序员幽默爆笑锦集
  • Java多态
  • PAT A1017 优先队列
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Sass Day-01
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • spring security oauth2 password授权模式
  • 机器学习 vs. 深度学习
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 网页视频流m3u8/ts视频下载
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 最近的计划
  • k8s使用glusterfs实现动态持久化存储
  • mysql面试题分组并合并列
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​你们这样子,耽误我的工作进度怎么办?
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #前后端分离# 头条发布系统
  • $.ajax,axios,fetch三种ajax请求的区别
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (1)(1.13) SiK无线电高级配置(五)
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (20050108)又读《平凡的世界》
  • (Python第六天)文件处理
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (算法)求1到1亿间的质数或素数
  • ./和../以及/和~之间的区别