021 - C++ 构造函数

news2024/10/7 12:24:51

我们继续学习 C++ 的面向对象编程,本期主要是讲其中的 构造函数

什么是构造函数呢?

构造函数基本上是一种特殊类型的方法,它在每次实例化对象时运行。

我们直接来看一个例子吧。

例子时间

我们将要通过创建一个 Entity 类来深入了解这个知识点。

iS68h8.png

这个类有两个成员变量,float X、Y,用来描述 Entity 的位置。然后创建一个 Entity 实例。再给它一个 Print 函数,这样它就能够将它的位置信息输出到控制台。

运行这段代码,结果是完全正常的,没有任何问题。

然而你应该会注意到,输出的值看起来像是随机的值。

这是因为当我们实例化 Entity 为它分配内存时,我们实际上并没有初始化那个内存空间,这意味着我们实际输出了那个内存空间里面原来的值。

我们还可以从另一个角度说明一下当前遇到的情况。

因为 X 和 Y 是公有的,所以我们可以在主函数中手动打印 X。

iS6NZZ.png

调试代码,我们会得到一个错误,未初始化局部变量。换句话说,我们试图使用没有初始化的内存,这个编译器不允许这样操作。

这个 Print 函数虽然可以通过编译,是它显示的并不是我们所期望的。因为它直接打印 X 和 Y,但是它们都设置了看似随机的值,这个不太一样。

看起来接下来的任务就是初始化内存了,我们需要将它设置为 0。——我们期望在不指定一个值的情况下,这个位置的值默认为 0。

我需要一种方法,当构造一个 Entity 的实例时,我们可以把 X 和 Y 设为 0,除非它们已经被指定了其它的值。

解决问题的方法之一是直接创建一个初始化的方法。

我们可以创建 Init 方法。

iS6rHF.png

它是 void 类型的函数,你可以看到它只是用来设置 X 和 Y 的值为 0的。

现在我们能做的就是当 Entity 对象实例创建时,可以调用这个 Init 方法。

调试运行程序,可以看到 X 和 Y 被设为了0 ,看起来我们完成了我们的要求。

然而,如果这样操作的话,我们会额外编写相当多的代码。每当你想在代码中创建一个对象,我们都需要调用 Init 函数,这样当代码越来越多的时候,写起来也会越来越麻烦。

当构造对象时,如果我们有办法直接运行这个初始化代码就好了。于是,就有了构造函数。

构造函数

构造函数是一种特殊类型的方法,这是一种每次你构造一个对象时都会自动调用的方法。

我们像定义其它方法一样定义它。然而特殊的是,它没有返回类型,并且它的名字必须与类的名称相同

iS6RTQ.png

写 Entity 的构造函数时,首先输入类名 Entity 。

可以选择给出一个参数,这个我们一会儿会讲到,参数的位置先空着。

然后可以给它一个函数主体。

在这种情况下,和之前一样让 X等于 0,Y 也等于 0。删掉 Init 方法,现在已经不再需要它了。

运行一下代码,你会发现和前面用 Init 方法是一样的效果。—— Init 方法被构造函数取代了。

实际情况是,如果你不指定构造函数,其实仍旧有一个构造函数。只不过它是一个叫做默认构造函数的东西,默认情况下已经为你准备好了,只不过默认构造函数实际上什么都没做,这和我们定义的这个构造函数函数体内完全空着是一样的效果。

像 Java 类的语言,基本数据类型比如 int 和 float,会自动初始化为0。但 C++ 的情况并非如此,你必须手动初始化所有基本类型,否则它们将被设置为原本该内存中值。

所以初始化是非常重要的。

以后的系列中,我会讲到更多关于初始化的内容以及正确初始化内存的不同策略和方法。

接下来让我们看一下带参数的构造函数。

iS6mkE.png

没错,其实你可以写很多的构造函数,前提是它们有不同的参数。这其实和我之前写一些同名方法的操作是一样的。这个过程叫函数重载。可以这样说,它们是 有相同的函数名,但是有不同的参数的不同函数版本

这里我加上 x 和 y 作为参数,在函数体中然后把 x 和 y 的值赋值给 X 和 Y。

我现在可以选择使用参数来构造 Entity 对象了。

iS6pBC.png运行程序之后,可以看到 10 和 5 出现在控制台,很棒哈。

构造函数讲的差不多了。

还有一些我需要提醒大家。

如果不实例化对象,构造函数将不会运行,所以如果你只使用一个类的静态方法,它是不会运行。我们还没有讨论堆内存的分配问题,在之后的是系列中会讲到的。

当使用 new 关键字并创建一个对象实例时,也会调用构造函数。

删除构造函数

也有一些方法可以删除构造函数。

举个例子。

iS6B9P.png

我们有一个 Log 类,它只有静态的日志方法,我只是想让人们像这样使用 Log 类,不创造实例而调用 Write 方法。

有两种不同的解决方法。

我们可以通过设置为私有(private)来隐藏构造函数。

iS6gAX.png

你可以看到 40 行得到一个错误,因为我不能访问构造函数,而之前不这样做,显然是允许构造对象的。

C++ 为我们提供了一个默认构造函数。然而我可以告诉编译器:我不想要那个构造函数了。

我们可以这样操作。

iS6xrt.png

可以看到实例化的地方有错误,因为默认构造函数并不存在,它已经被删掉了。

最后的话

还有一些特殊类型的构造函数,如复制构造函数、移动构造函数等。它们每一个都会单独有一期,因为它们都很复杂。

这就是构造函数的基本使用了,记住一句话就行:它是一个特殊的方法,在你创建类的实例时运行,主要用途是初始化该类。当你创建一个新对象实例时,构造函数确保你初始化的所有内存,完成你所有需要做的设置。

本期就是这些。如果你有什么想法,可以放在评论区哈,下期再见。

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

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

相关文章

vscode python3.6配置pcl点云库 obj3d模型转pcd点云图

配置vscode python3.6的环境我就跳过了,网上都有 1.下载PCL1.9 github:pcl-1.9.1 百度云:PCL-1.9.1-AllInOne-msvc2017-win64提取码adcx 2.安装硬盘任意位置,我是E盘,在安装过程中会弹出openni的安装提示,将它安装路径选择在E:\PCL 1.9.1\3rdParty\OpenNI2,等待安装完成 3.…

.netCHATING 10.4 for NET6-7.0-Crack

.NET 6.0图表支持--dotnetcharting .netCHATING 10.4添加了.NET 6.0图表nuget包和.NET 6.0图表示例包(需要Visual Studio 2022),.NET 5是.NET Core 3.1和.NET Framework 4.8的继任者,旨在为.NET开发人员提供新的跨平台开发体验。…

Mysql列的类型定义(字符串类型)

文章目录 一、CHAR 类型和 VARCHAR 类型 1.字符串字符(M)2.实战类型二、TEXT 类型 1.类型表2.特别注意3.实战建议4.实战练习三、ENUM 和 SET 类型 1.ENUM类型2.SET类型总结 一、CHAR 类型和 VARCHAR 类型 CHAR类型和VARCHAR类型都在创建表时指定了最大长度,其基本形…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…

对数据结构的初步认识

前言: 牛牛开始更新数据结构的知识了.本专栏后续会分享用c语言实现顺序表,链表,二叉树,栈和队列,排序算法等相关知识,欢迎友友们互相学习,可以私信互相讨论哦! 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟&a…

拿下多家车企定点!4D毫米波雷达「域」系统首发出道

从1R、2R、3R到整车360感知方案,毫米波雷达的前装市场需求量依然保持着快速增长的态势。 高工智能汽车研究院监测数据显示,2022年中国市场(不含进出口)前装标配搭载ADAS毫米波雷达(前向后向盲区)交付1795.…

mov是什么格式的视频,mov怎么转mp4

mov是什么格式的视频,MOV即QuickTime影片格式,它是Apple公司开发的一种音频、视频文件格式,用于存储常用数字媒体类型。MOV部分编码在没有quicktime的电脑中不能播放,不能后期剪辑制作MP4的通用率高于MOV格式支持MP4格式的播放器绝…

获得将要生成的资源的GUID

1)获得将要生成的资源的GUID ​2)多个小资源包合并为大资源包的疑问 3)模型Meta中的hasExtraRoot参数的作用和历史原因 4)合批注意点 这是第333篇UWA技术知识分享的推送,也是《厚积薄发 | 技术分享》第三回&#xff0c…

PMP-上班摸鱼整理的知识点

1、主要解决流程:问题-风险-变更: 先分析是问题还是风险,解决问题、可以减少新的风险,登记风险,可以随时应对问题,2、变更管理流程 变更原则: 需提正式变更申请,先分析评估后变更,不改变基准项目经理审批,改…

2-07 使用JMeter测试单节点与集群的并发异常率

2-07 使用JMeter测试单节点与集群的并发异常率 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YVXaAkn2-1682304913240)(https://static.editool.cn/upload/47093438fcec4683a50626ae46a49942/pic-371.jpg)] [外链图片转存失败,源站可能有防盗链机制…

一些海洋资料收集及磁力tiff的数据提取

以下资料都来自于网络和公开发表的文献,欢迎下载 1、第一批至第十一批农业部国家级种质资源保护区的范围: 链接:https://pan.baidu.com/s/1fGcVcdbOUb3tOlYB8d4JUg 提取码:kgix 2、EGM2008 链接:https://pan.baidu…

matlab实现在画图的图窗里播放点数据的循环

数据准备 我准备好了打包的数据文件供演示下载,只需要小白式的操作。传送门 文件里集成了处理好的点云文件,如果你想显示曲线,只需要把你的数据批量更换上去即可。   每一个里面包含了以下信息: location:不同点的…

【GDOUCTF2023】wp

【GDOUCTF2023】 WEB hate eat snake js小游戏&#xff0c;玩游戏得到flag&#xff0c;修改一下js源码 EZ WEB 访问 /super-secret-route-nobody-will-guess 发送PUT请求&#xff1a; 受不了一点 <?php error_reporting(0); header("Content-type:text/html;char…

如何创建 SAP PM 通知

目的 了解如何根据创建通知的要求将通知详细信息从一个屏幕发送到另一个屏幕。为了解释这一点&#xff0c;我们将引导您完成以下步骤。 使用 title&#xff08;&#xff09; 更改屏幕标题删除“引用”组框根据交易自定义屏幕添加用于复制和发送通知详细信息的函数 在脚本文件…

面试官灵魂一问:SELECT COUNT(*) 会造成全表扫描吗?

SELECT COUNT(*) 会造成全表扫描吗&#xff1f; 前言SQL 选用索引的执行成本如何计算实例说明总结 前言 SELECT COUNT(*)会不会导致全表扫描引起慢查询呢&#xff1f; SELECT COUNT(*) FROM SomeTable网上有一种说法&#xff0c;针对无 where_clause 的 COUNT(*)&#xff0…

云计算下的企业数据备份与恢复实践

在当前的数字化时代&#xff0c;数据已经成为企业的核心资产之一。对于企业而言&#xff0c;数据的安全性和可用性至关重要。数据的丢失和破坏会给企业带来巨大的损失&#xff0c;因此&#xff0c;备份和恢复数据已经成为企业数据管理的重要环节。随着云计算的普及和发展&#…

深度学习模型参数量与训练数据量的平衡对泛化性能的影响

一、引言 深度学习模型在计算机视觉、自然语言处理等领域取得了显著的成果。为了获得泛化性能良好的模型&#xff0c;研究者需要在模型复杂度和训练数据量之间找到合适的平衡。本文将探讨这两者之间的关系以及如何在实际应用中实现最佳效果。 二、模型复杂度与训练数据量的关…

Windows云服务器配置多用户登录

Windows Server 2012操作系统的云服务器为例介绍实现多用户登录的操作步骤 安装桌面会话主机和远程桌面授权 登录Windows云服务器。在操作系统界面&#xff0c; 打开“服务器管理器”&#xff0c;单击“添加角色和功能”。 图1 添加角色和功能 保持默认参数&#xff0c;单击“…

Mars3d引用单个示例文件WeiVectorTileLayer.js报错的解决办法

参考文档修改文件后&#xff0c;发现依然报错&#xff1a; Mars3d单独引用示例文件教程_3d文件示例_绵绵-火星科技的博客-CSDN博客 具体报错截图&#xff1a; 看报错是&#xff1a; CesiumVectorTile.js里的错误&#xff0c;进去看看错误行&#xff0c;是不是缺cesium // if …

数组题目总结 -- 差分数组

零. 差分数组工具类 1. 思路和代码 diff 存在的意义就是想要通过构建 diff 数组来实现对原数组&#xff08;nums&#xff09;频繁的加减操作。差分数组的构建代码&#xff1a; int[] res new int[diff.length]; // 根据差分数组构造结果数组 res[0] diff[0]; for (int i …