C++从入门到入土(三)--6个默认成员函数

目录

前言

什么是默认成员函数

构造函数

概念

特性

析构函数

 概念

特性

拷贝构造函数

概念

特性

赋值运算符重载

特性


前言

很久没有更新文章了,最近把类和对象相关的知识重新回顾了一遍,打算从今天开始继续更新C++从入门到入土系列。前面我们简单的介绍了类和对象,本期我将继续深入和大家探讨类和对象当中重要的6个默认成员函数,相信看完本篇文章您会对类和对象有更深入的理解,话不多说,我们正式开始。

什么是默认成员函数

简单来说,默认成员函数就是指:用户没有显示实现,编译器会自动生成的成员函数称为默认成员函数,如果用户显示写了就不会自动生成。

一共分为三大类,初始化和清理(构造函数、析构函数),拷贝复制(拷贝构造、赋值重载),取地址重载(普通对象取地址、const对象取地址)。

构造函数:主要完成对象的初始化工作

析构函数:主要完成对象的清理工作

拷贝构造:使用同类对象初始化创建对象

赋值重载:把一个对象赋值给另一个对象

取地址重载:主要是对普通对象和const对象取地址

构造函数

我们在用C语言写代码时会出现一个问题,有时忘记对数据进行初始化从而导致程序运行发生崩溃,于是C++为了解决这个问题引入了构造函数这个概念

概念

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

特性

1.函数名与类名相同

2.无返回值

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

4.构造函数可以重载

5.如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显示定义编译器将不再生成

下面我将依次讲解上述特性:

首先构造函数是可以支持重载的,通过对构造函数进行缺省参数我们可以写多个初始化方式,例如:

 

 假如我们没有写默认构造函数则会发生什么呢?我们观察下面代码:

 

当我们把构造函数屏蔽之后再重新运行代码之后我们发现出现了随机值,前面我们知道,如果我们不显示写构造函数那么编译器会默认生成构造函数,但是为什么编译器自动生成的默认构造函数会出现随机值呢?原因在于:C++把类型分为内置类型和自定义类型。内置类型就是语言提供的数据类型,自定义类型就是struct/union等自己定义的类型,对于内置类型没有规定要不要处理,自定义类型取调用它的无参构造,没有无参构造就会报错。

此时我们发现,C++语法自动生成的默认构造函数似乎没有什么用处,因此C++11中针对这一缺陷规定了:内置类型的成员变量在声明时可以给默认值,

那么什么是默认构造呢?总的来说,不传参数就可以调用的函数就是默认构造,如果没有默认构造就会报错,其中包括:无参构造函数、全缺省构造函数、我们没有写编译器自动生成的构造函数。

析构函数

 概念

与构造函数功能相反,析构函数是在对象销毁时自动调用的函数,完成对象中资源清理的工作。

特性

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

2.无参数无返回值类型

3.一个类只能有一个析构函数,若未显示定义则系统会自动生成默认的析构函数(析构函数不能重载)

4.对象生命周期结束时自动调用析构函数

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

6.如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数

拷贝构造函数

概念

只有单个形参,该形参是对本类类型对象的引用(一般使用const修饰),在已存在的类类型对象创建新对象时由编译器自动调用

特性

1.拷贝构造函数是构造函数的一个重载形式

2.拷贝构造函数的参数只有一个且必须是对类类型对象的引用,使用传值方式直接报错,会引发无穷递归

3.若未显示定义编译器会生成默认的拷贝构造函数。默认生成的拷贝构造函数对象按内存存储字节序完成拷贝,这种拷贝叫浅拷贝,也叫值拷贝。

4.适用场景:使用已存在的对象创建新对象;函数参数类型为类类型的对象;函数返回值类型为类类型的对象

赋值运算符重载

C++为了增强代码的可读性引入了赋值运算符重载,其格式是operator后面接需要重载的运算符符号,例如:operator==、operator+=、operator-=。为什么要引入赋值运算符重载呢?我们在使用C语言写代码时有时会出现这样的问题:我们要写一个加减函数或者比较两个数字大小的函数时我们所取的函数名有时不能反映函数的功能,于是为了解决这一问题C++引入赋值运算符重载这一语法,用operator加操作符代替函数名可以清楚反应函数的功能,同时我们在调用时可以和自定义类型的调用类似,极大增强了代码的可读性。

需要注意的是:重载的操作符必须有一个类类型的参数,用于内置类型的运算符其含义不能改变;作为类成员函数重载时,其形参看起来比操作数少1,因为成员函数的第一个参数为隐藏的this;.*   :: sizeof  ?:    .这五个操作符无法重载。

特性

1.格式:参数类型:const T&,传引用提高效率;返回值类型:T&,有返回值是为了支持连续赋值;检测是否自己给自己赋值;返回*this

2.赋值运算符只能重载成类的成员函数,不能重载为全局函数。如果要重载为全局无法访问私有成员,解决方法:提供这些成员的get和set;友元;重载为成员函数。

3.用户没有显示写时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝

以上就是本文的全部内容,受限于博主的知识水平,可能文章中有些许不足,欢迎大家指正。如果本文对您有帮助的话记得点赞收藏加关注,您的点赞就是对我最大的鼓励。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DVWA中SQL注入漏洞细说

SQL注入是一种安全漏洞,它允许攻击者通过影响Web应用程序的后端数据库。攻击者可以通过在输入字段中插入恶意SQL代码来执行非授权查询,从而获取或修改数据。 在开始启动SQL注入之前我们先将DVWA的安全等级调整到Low 1、我们在SQL Injection中输入 1 and…

Linux文件恢复

很麻烦 一般还是小心最好 特别恢复的时候 可能不能选择某个文件夹去扫描恢复 所以 删除的时候 用rm -i代替rm 一定小心 以及 探索下linux的垃圾箱机制 注意 一定要恢复到不同文件夹 省的出问题 法1 系统自带工具 debugfs 但是好像不能重启? testdisk 1、安装 …

Flink笔记整理(四)

Flink笔记整理(四) 文章目录 Flink笔记整理(四)六、Flink中的时间和窗口6.1 窗口(Window)窗口的概念窗口的分类窗口API概览窗口分配器窗口函数(Window Functions) 6.2 时间语义&…

MySQL的库操作和表操作

文章目录 MYSQLSQL语句分类服务器,数据库和表的关系 库操作表操作 MYSQL SQL语句分类 DDL【data definition language】 数据定义语言,用来维护存储数据的结构代表指令: create, drop, alterDML【data manipulation language】 数据操纵语言&#xff0…

关键路径算法(Critical Path)

这个算法《算法导论》中并没有提及,很多书和博客说的有点奇怪,所以写本文作为笔记。 关键路径是什么 关键路径的定义非常简单:就是一个图中,权值之和最大的路径就是关键路径。 那么就可以知道关键路径不唯一。 为什么有关键路…

安装 moleculeSTM 踩坑日记

“学习 LLM ,在大模型时代为自己存张船票”。 相信很多人都有这样的想法。那么,在 AI for science 领域,哪些 LLM 模型值得一试呢? 笔者认为: LLM 直接预测 SMILES 性质 or 直接生成 SMILES 的技术路线是行不通的。因…

搭建DNS正向解析,反向解析+搭建DNS主从架构+搭建DNS多区域+时间同步

主要在局域网中配置,不存在外网 正向解析:域名解析为IP named.conf 解决权限 named.rfc1912.zones 解决解析方式 环境准备:三台机器都做下面的操作 基础配置:网络配置,关闭安全架构,关闭防火墙&#x…

使用langchain4j调用大模型写个聊天助手

LangChain4j是一款基于Java的高效、灵活的AI大模型应用框架,专为简化Java应用程序与LLMs(大语言模型)的集成而设计。它提供统一API和模块化设计,支持多种LLM提供商和嵌入模型,以及丰富的工具箱,如AI服务和R…

光伏混合储能直流微网直流母线电压下垂控制MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 此模型以混合储能系统为研究对象,采用基于关联参数SOC的改进下垂控制策略,将初始下垂系数与储能单元SOC的n次幂的比值作为现行下垂系数,通过改变n值,…

【快速上手ESP32(ESP-IDF)】ADC数模转换(含单次转换和连续转换以及校准)

这篇为重置版。 因为准备录制视频了,然后回过头看看之前讲ADC的文章发现有不少错误的地方(但是代码是可以用的),而且讲的也不全面,因此决定写下这个重置版。 这边提供三种使用ADC的方法,第一种是老方法&a…

港科夜闻 | 香港科大与阿里巴巴合作,计划成立大数据与人工智能联合实验室

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与阿里巴巴合作,计划成立大数据与人工智能联合实验室。香港科大7月19日与阿里巴巴集团签署合作备忘录,计划成立「香港科技大学–阿里巴巴大数据与人工智能联合实验室」,就生成…

科普文:万字梳理31个Kafka问题

1、 kafka 是什么,有什么作用 2、Kafka为什么这么快 3、Kafka架构及名词解释 4、Kafka中的AR、ISR、OSR代表什么 5、HW、LEO代表什么 6、ISR收缩性 7、kafka follower如何与leader同步数据 8、Zookeeper 在 Kafka 中的作用(早期) 9、Kafka如何快…

UDP程序设计

UDP协议概述 UDP,User Datagram Protocol,用户数据报协议,是一个简单的面向数据报(package-oriented)的传输层协议,规范为:RFC 768。 UDP提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去…

Java | Leetcode Java题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; class Solution {public int lengthOfLIS(int[] nums) {int len 1, n nums.length;if (n 0) {return 0;}int[] d new int[n 1];d[len] nums[0];for (int i 1; i < n; i) {if (nums[i] > d[len]) {d[len] nums[i];} else {int…

做一个能和你互动玩耍的智能机器人之四--固件

在openbot的firmware目录下我们能够找到arduino的固件源码和相关的文档。 openbot的controller目录下&#xff0c;是控制器的代码目录&#xff0c;用来控制机器人做一些动作。未来的目标是加入大模型&#xff0c;使其能够理解人的语言和动作来控制。 固件代码&#xff0c;支持…

利用小爱同学与点灯科技+esp8266+舵机,制作智能关灯神器:小白也可制作,米家同步设备可实现多部手机进行控制。(亲测有用)

利用小爱同学与点灯科技&#xff0c;制作智能关灯神器&#xff1a;小白也可制作&#xff0c;米家同步设备可实现多部手机进行控制。 文章目录 利用小爱同学与点灯科技&#xff0c;制作智能关灯神器&#xff1a;小白也可制作&#xff0c;米家同步设备可实现多部手机进行控制。1.…

19. Revit API: Parameter(参数)

一、前言 我们在前面或多或少提到也用到参数了&#xff0c;这篇便细讲一下。 首先&#xff0c;我们知道好多信息都藏在参数里&#xff0c;或者说可以从参数中获取。我们还能够通过调整参数的值&#xff0c;改变模型的形态&#xff0c;即族的参变。 其次&#xff0c;有时族上…

一文讲透如何使用CSS美化HTML界面

上一篇文章(初识HTML文件&#xff0c;创建自己的第一个网页&#xff01;)介绍了HTML文件&#xff0c;并实战练习了如何编写一个结构简单的HTML网页&#xff0c;但最后也提到了单纯使用HTML语言创建的网页并不美观&#xff0c;有没有一个东西像PS能够美化图片一样让我们能够对我…

【前端 16】使用Ajax发送异步请求

Ajax 基础入门&#xff1a;实现异步请求 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。通过使用 Ajax&#xff0c;可以在后台与服务器交换数据&#xff0c;这意味着可以在不影响用户…