[ C++ ] C++ 类和对象 -- 类的六个默认成员函数

目录

1.构造函数

2.析构函数

3.拷贝构造函数

4.赋值操作符重载

5.两个取地址操作符的重载


在C++中当你创建一个空类,那这个空类是什么都没有吗?不是的,编译器会默认帮你生成六个成员函数

1.构造函数

构造函数是特殊的成员函数,虽然名称是构造,但不是参与对象的创建,而是完成对对象内成员变量的初始化,构造函数有以下特点:

  • 构造函数和类名相同
  • 没有返回值
  • 构造函数可以重载
  • 对象实例化时自动调用构造函数

构造函数完成在类对象创建时由编译器自动调用,保证每个成员都有一个合适的初始值,保证在对象生命周期内只完成一次初始化

class A
{
public:
//无参的构造函数A(){}
private:int _a;
};

构造函数可以重载,根据参数的不同实现不同的构造函数

默认构造函数只有三种:

  •         1.我们不写编译器默认生成的构造函数
  •         2.无参的构造函数
  •         3.全缺省的构造函数

类对象中默认构造函数只能有一个,有多个会报错,编译器无法识别要调用哪一个构造函数

class A
{
public:A(){}A(int a = 1){_a = a;}
private:int _a;
};
int main()
{A a1;return 0;
}

当创建一个类对象,不传参就会调用默认构造函数,可是有两个默认构造函数,这样编译器就无法识别要调用哪一个 

默认构造函数对内置类型不做处理,对自定义类型会去调用自定义类型的默认构造函数

class B
{
public:B(int b = 1){_b = b;}
private:int _b;
};
class A
{
public:
private:int _a;B _b;
};
int main()
{A a1;return 0;
}

而当B中没有默认构造函数时,A中又没有显示调用B的构造函数时,创建A对象就会报错

2.析构函数

析构函数也是特殊的成员函数,完成的是对象销毁时类内成员变量的清理工作

  • 析构函数跟类名相同,函数名前加上~
  • 没有返回值和参数
  • 对象内有且只有一个析构函数
  • 在对象生命周期结束时自动调用析构函数
class A
{
public:~A(){}//析构函数
private:int _a;B _b;
};

当你没有显示定义析构函数时,编译器会给你默认生成一个析构函数。

对内置类型不做处理,对自定义类型去调用它的析构函数

析构函数不管你是显示写的还是编译器默认生成的,它都会去调用自定义类型的析构函数

当对象内有成员变量有在堆上申请空间时,则需要我们显示写析构函数去进行释放。

而对于自定义类型则会调用它的析构函数

如果成员变量在堆上申请了空间而没有调用析构函数清理则就会内存泄漏

 函数运行时创建对象,实际是在函数的栈帧中存放,而结合栈后入先出的特性,后构造的会先析构。

3.拷贝构造函数

拷贝构造函数,第一个参数是类类型对象的引用(一般用const修饰),在用一个已存在的对象创建新对象时 编译器会自动调用

  • 拷贝构造函数是构造函数的一种重载
  • 第一个参数是类类型的引用

编译器默认生成的拷贝构造对内置类型做值拷贝,对自定义类型会去调用自定义类型的拷贝构造

但这里的值拷贝只是把原对象变量的值按照字节一个个拷贝给新对象,当有指针变量时,就会出现两个对象中的指针成员变量存放的是一样的地址,这样在使用和销毁时就会出现问题。

销毁时调用析构函数,两个对象那就是两次析构,也就是说会对指针变量进行两次析构,从而程序崩溃

这里就需要显示的定义拷贝构造从而进行深拷贝

需要重新申请空间,然后再进行值拷贝 

需要注意的是,拷贝构造的第一个参数只能是类类型对象的引用,因为当是类类型对象时,就会发生无穷递归。

A(A a){}//不带引用的拷贝构造

在C++中规定,当自定义类型传参时使用形参传参时,会去调用本类型对象的拷贝构造构造一个临时对象给形参。而你传参时调用的本类型对象的拷贝构造又需要传参,你又传的是形参,这时就会一直传参发生拷贝构造,而拷贝构造又是类类型对象接收,就又会发生拷贝构造

4.赋值操作符重载

赋值运算符重载需要用到关键字operator,运算符重载函数有返回值和参数,运算符是几元的就有几个参数,C++规定运算符重载不可以改变运算符本来的逻辑,不可创建不存在的运算符进行重载

Date& operator=(const Date& d)
{//赋值
}

以下五个运算符不可重载:

        .*         sizeof           .           ?:               ::

而赋值运算符=的重载我们不显示实现,编译器也会默认给我们生成一个,默认生成的赋值重载对内置类型完成值拷贝,对自定义类型会去调用它的赋值运算符重载。 

这里就会遇到和拷贝构造相同的问题,编译器默认生成的赋值运算符重载仅仅只是浅拷贝,而浅拷贝在析构时程序会崩溃,所以这里也一样要进行深拷贝

5.两个取地址操作符的重载

取地址操作符的重载编译器默认生成的就已经够用了,所以这里不过多介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558991.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode 10.9 94.二叉树的中序遍历

94. 二叉树的中序遍历 已解答 简单 相关标签 相关企业 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出&#xff1a…

makefile的基本练习

假设有如下目录结构:(目录结构图) 完成以下操作: 1、通过纯命令编写Makefile文件,并发现使用纯命令的不足; 2、在Makefile中,添加变量,简化参数的重复书写; 3、尝试在多目…

『网络游戏』客户端使用PESorket发送消息到服务器【14】

上一章服务器已经完成使用PESorket 现在我们将其导出在客户端中使用 生成成功后复制 粘贴到Unity项目中 进入Assets文件夹 粘贴两个.dll 创建脚本:ClientSession.cs 编写脚本: ClientSession.cs 编写脚本:GameStart.cs 将GameStart.cs脚本绑定在摄像机上 运行服务器 运行客户端…

Linux网络驱动实验

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用,方便进一步记录自己的实践总结。 网络驱动是 linux 里面驱动三巨头之一,linux 下的网络功能非常强大,嵌入式 linux 中也常常用到网络功能。前面我们已经讲过…

8.12 矢量图层面要素单一符号使用十三(插值线渲染边界)

8.12 矢量图层面要素单一符号使用十三(插值线渲染边界)-CSDN博客 目录 前言 插值线渲染边界(Outline: Interpolated Line) QGis设置面符号为插值线渲染边界(Outline: Interpolated Line) 二次开发代码实现插值线渲染边界&…

Base64字符串转图片在线工具

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 基本原理 Base64编码,作为一种将二进制数据转换为文本格式的方法,其核心在于利用64个可打印字符来表征任意的二进制信息。这一编码方式的出现&#…

erlang学习:Linux命令学习11

crontab命令 crontab命令是用于管理定时任务的命令行工具。它提供了多种选项和参数,可以用来创建、编辑、查看和删除用户的定时任务。 常用命令 以下是一些常用的crontab命令: crontab -e:编辑当前用户的定时任务列表。该命令会在默认编辑…

PostgreSQL学习笔记三:数据类型和运算符

数据类型和运算符 PostgreSQL 支持多种数据类型和运算符,以下是一些常见的数据类型和运算符的概述: 数据类型 基本数据类型 整数类型: SMALLINT:2 字节,范围 -32,768 到 32,767。INTEGER:4 字节&#xff0…

minio简单使用

文章目录 简介官方地址Linux下载安装安装服务启动关闭帮助命令 java开发minio依赖包新建项目pom配置文件配置类Service测试类运行测试 Api使用前言针对桶的操作查看某个桶是否存在创建一个桶返回桶列表删除一个桶 针对文件的操作上传文件到桶中(本地文件上传)上传文件到桶中(基…

C++标准模板库STL之容器--string

STL简介 STL(standard template libaray - 标准模板库)是C标准库的重要组成部分,不仅是一个可复用的组件库,还是一个包罗了数据结构与算法的软件框架。 STL的六大组件及相关函数 仿函数greater、less……算法find、swap、reverse、…

2020年华为杯数学建模竞赛D题论文和代码

无人机集群协同对抗 摘 要: 本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题,结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法,构建了无人机集群协同对抗推演模型。 针对问题一&#…

OBOO鸥柏全户外液晶广告机室外触控一体机技术标参数公布

整机参数技术公布: OBOO鸥柏智能43寸/49寸/55寸/65寸/75寸/86寸/98寸/110寸全户外LCD液晶安卓系统网络广告屏/室外触摸屏查询一体机投标参数投标标准款。 1、液晶屏具工业级液晶面板,亮度为2000cd/㎡,并且具备自动感光亮度调节,…

工业网关的主要功能-天拓四方

引言: 在当今工业自动化的浪潮中,工业网关作为一种重要的网络连接设备,扮演着不可或缺的角色。其强大的功能使得工业设备能够无缝接入网络,实现远程监控、控制、数据采集和协议转换等,极大地提升了工业生产的效率和智…

算法专题五: 位运算

目录 常见位运算总结1. 位1的个数2. 比特位计数3. 汉明距离4. 只出现一次的数字5. 只出现一次的数字Ⅲ6. 判定字符是否唯一7. 丢失的数字8. 两正数之和9. 只出现一次的数字Ⅲ10. 消失的两个数字 常见位运算总结 重点 : 1. 位1的个数 算法思路: 这道题就用到了我们总结的那个第…

图解 微信开发者工具 小程序源码 调试、断点标记方法 , 微信小程序调试器,真机调试断点调试方法,小程序网络API请求调试方法 总结

在我们使用微信开发者工具进行微信小程序开发的时候,在这个微信开发者工具的代码编辑框里面我们是无法像使用vscode, idea等IDE工具时那样直接对代码打断点进行调试, 原因是小程序实际上他就是一个web浏览器应用的包装, 在其内部使用的还是类似chrome的…

C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?

目录 1、概述 2、从汇编的角度去理解问题的若干实例说明 2.1、使用空指针去访问类的数据成员或调用类的虚函数为什么会引发崩溃? 2.2、从汇编代码的角度去理解多线程的执行细节,去理解多线程在访问共享资源时为什么要加锁 2.3、使用Windbg静态分析d…

Canal 扩展篇(阿里开源用于数据同步备份,监控表和表字段(日志))

1.Canal介绍 Canal把自己伪装成从数据库,获取mysql主数据库的日志(binlog)信息,所以要想使用canal就得先开启数据库日志 https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析,提供增量…

Spring Boot2.x教程:(五)日志分割

日志分割 1、概述2、为什么选择Logback2.1、创建配置文件2.2、配置说明2.3、修改应用程序配置2.4、启动应用程序 3、总结 大家好,我是欧阳方超,可以扫描下方二维码关注我的公众号“欧阳方超”,后续内容将在公众号首发。 1、概述 在现代应用程…

ubuntu18.04系统中图形化界面

一、Ubuntu 18.04 中,使用 GDM 作为默认的图形用户界面(GUI)管理器。GDM 是 GNOME Display Manager 的缩写,它是用于 Ubuntu 的显示管理器,负责处理登录和会话管理。 通过命令行重启 Ubuntu 18.04 上的图形界面服务&am…

技术路线图用什么画?用这个在线工具轻松完成绘制!

在当今快速发展的技术世界中,技术路线图已成为企业和团队不可或缺的战略规划工具。它不仅能够清晰地展示技术发展方向,还能帮助团队成员、利益相关者和投资者更好地理解和参与技术战略的制定过程。但不可否认的是,创建一个有效的技术路线图并…