P16 C++构造函数

目录

前言

01 什么是构造函数呢?

02 非构造函数初始化变量

03 构造函数初始化变量

04 带参数的构造函数。

最后的话


前言

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

01 什么是构造函数呢?

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

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

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

#include <iostream>class Log
{ 
public:int maxSize;   int minSize;public:void print(){std::cout << maxSize << std::endl;std::cout << minSize << std::endl;}
};int main()
{Log log;log.print();return 0;
}

这个类有两个成员变量,int maxSize,minSize用来描述 Log的最大最小数据量。然后创建一个 Log实例。再给它一个 Print 函数,这样它就能够将它的位置信息输出到控制台。

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

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

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

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

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

02 非构造函数初始化变量

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

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

我们可以创建 Init 方法。

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

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

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

然而,如果这样操作的话,我们会额外编写相当多的代码。每当你想在代码中创建一个对象,我们都需要调用 Init 函数,这样当代码越来越多的时候,写起来也会越来越麻烦。当构造对象时,如果我们有办法直接运行这个初始化代码就好了。于是,就有了构造函数。

03 构造函数初始化变量

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

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

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

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

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

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

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

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

04 带参数的构造函数。

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

这里我加上 max 和 min 作为参数,在函数体中然后把 max 和 min的值赋值给 maxSize和 minSixze。

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

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

构造函数讲的差不多了。

还有两点我需要提醒大家。

#include <iostream>class Log
{ 
public:int maxSize;   int minSize;public:Log(int max,int min) {maxSize = max;minSize = min;}void print(){std::cout << maxSize << std::endl;std::cout << minSize << std::endl;}
};int main()
{Log log(10,6);log.print();return 0;
}
  1. 如果不实例化对象,构造函数将不会运行,所以如果你只使用一个类的静态方法,它是不会运行。我们还没有讨论堆内存的分配问题
  2. 当使用 new 关键字并创建一个对象实例时,也会调用构造函数。

最后的话

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

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

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

相关文章

tinyViT论文笔记

论文&#xff1a;https://arxiv.org/abs/2207.10666 GitHub&#xff1a;https://github.com/microsoft/Cream/tree/main/TinyViT 摘要 在计算机视觉任务中&#xff0c;视觉ViT由于其优秀的模型能力已经引起了极大关注。但是&#xff0c;由于大多数ViT模型的参数量巨大&#x…

MetaObject-BeanWrapper-MetaClass-Reflector的关系

MetaObject、BeanWrapper、MetaClass、Reflector之间是通过装饰器模式逐层进行装饰的。其中MetaObject、BeanWrapper是操作对象&#xff1b;MetaClass、Reflector是操作Class ObjectWrapper类结构图 BaseWrapper是对BeanWrapper、MapWrapper公共方法的提取及类图的优化&#…

线程的创建方式

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;mysql&#xff0c;javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 线程的创建方…

知识点小总结

‘Integer(int)‘ 已经过时了 https://blog.csdn.net/qq_43116031/article/details/127793512 解决Java中的“找不到符号“错误 解决Java中的“找不到符号“错误_java: 找不到符号_很酷的站长的博客-CSDN博客 可右键打开 错误: 编码 UTF-8 的不可映射字符 错误: 编码 UTF-8 …

Less的函数的介绍

文章目录 前言描述style.less输出后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;…

OD机考真题搜集:导师请吃火锅

题目 入职后,导师会请你吃饭,你选择了火锅, 火锅里会在不同时间下很多菜, 不同食材要煮不同时间,才能变得刚好合适, 你希望吃到最多的刚好合适的菜, 但是你的手速不够快用m代替手速, 每次下手捞菜后至少要过m秒, 才能再捞(每次只能捞一个)那么用最合理的策略, 最多…

什么是无监督学习

1 概况 1.1 定义 无监督学习&#xff08;Unsupervised Learning&#xff09;是机器学习的一种类型&#xff0c;它涉及从未标记的数据中发现隐藏的模式。与监督学习不同&#xff0c;无监督学习的数据没有显式的标签或已知的结果变量。其核心目的是探索数据的内在结构和关系。无…

PTA-6-46 手机接口-适配器模式

题目&#xff1a; 用适配器模式编写程序代码。设计一个接口Phone&#xff0c;包含五个抽象方法&#xff1a;dial ()、location()、photo()、music()、video()&#xff0c;分别表示拨号、定位、拍照、音乐、视频功能。定义一个抽象类实现接口所有方法&#xff0c;以及定义两个子…

Less 嵌套规则

文章目录 前言描述style.less输出后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;…

数据库基础教程之创建触发器,实现自动更新时间戳(四)

postgresql 更新时间戳需要通过触发器来实现,这里给出两种方法来实现。 创建字段create_time和edit_time 通过Navicat在添加字段时候将字段设置为timestamp类型,生成时间戳方式为CURRENT_TIMESTAMP或者设置为now(),然后点击保存。 新建函数 点击函数,然后在弹出的函数向导中…

斐波那契数(力扣LeetCode)动态规划

斐波那契数&#xff08;力扣LeetCode&#xff09;动态规划 题目描述 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F…

RabbitMQ之MQ的可靠性

文章目录 前言一、数据持久化交换机持久化队列持久化消息持久化 二、LazyQueue控制台配置Lazy模式代码配置Lazy模式更新已有队列为lazy模式 总结 前言 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消息丢失&#xff0c;所以MQ的可靠性也非常重要。 一、…

将本地项目上传到gitee

本文详细介绍如何将本地项目上传到gitee 1.登录gitee创建一个与本地项目名相同的仓库 2.进入本地项目所在路径&#xff0c;打开Git Bash 3.执行初始化命令 git init4.添加远程仓库 4.1 点击复制你的HTTPS仓库路径 4.2 执行添加远程仓库命令 git remote add origin 你的…

Vue常见的实现tab切换的两种方法

目录 方法一&#xff1a;事件绑定属性绑定 效果图 完整代码 方法二&#xff1a;属性绑定 动态组件 component标签 效果图 完整代码 方法一&#xff1a;事件绑定属性绑定 效果图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta c…

【中间件】消息队列中间件intro

中间件middleware 内容管理 introwhy use MQMQ实现漫谈主流消息队列QMQ IntroQMQ架构QMQ 存储模型 本文还是从理论层面分析消息队列中间件 cfeng现在处于理论分析阶段&#xff0c;以中间件例子&#xff0c;之前的blog对于中间件是从使用角度分享了相关的用法&#xff0c;现在就…

vue--The template root requires exactly one element.的解决办法

[vue/no-multiple-template-root] The template root requires exactly one element.eslint-plugin-vue 在vue中会出现以上问题 这是因为vue的模版中只有能一个根节点&#xff0c;所以在<template>中插入第二个元素就会报错 解决方案&#xff1a; 将<template>…

Vue框架学习笔记-Object.defineproperty函数

文章目录 前文提要Object.defineProperty作用Object.defineProperty参数使用例图getter&#xff0c;也就是get函数setter&#xff0c;也就是set函数 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 Object.defineProperty作用 当在js中声明了一个变…

在我国干独立游戏开发有多难?

游戏独立开发在中国&#xff0c;一直以来都是一条充满挑战的道路。尽管有着无限的激情和创意&#xff0c;但面对市场、资金、政策等多方面的困难&#xff0c;许多独立开发者在这条路上艰难前行。 首先&#xff0c;市场竞争激烈是中国游戏独立开发者面临的首要挑战。随着游戏产…

【Amazon】通过代理连接的方式导入 AWS EKS集群至KubeSphere主容器平台

文章目录 一、设置主集群方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 二、在主集群中设置代理服务地址方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 三、登录控制台验证四、准备成员集群方式一&#xff1a;使用 Web 控制台…

【好玩的 Docker 项目】目前最好用的网盘直链程序 ——AList,支持市面上几乎所有网盘!可以代替 Olaindex!

之前给大家介绍了 Olaindex 这个网盘直链程序,大家反馈还不错。 姨妈级安装教程!Olaindex—— 一款颜值贼高的 OneDrive 网盘直链项目 当时咕咕搭了一个,域名是:https://share.laoda.de 但是现在访问已经不是 olaindex 了,原因是这个网盘直链程序莫名其妙崩了…… 考虑到…