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 关键字并创建一个对象实例时,也会调用构造函数。

最后的话

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch导出rot90算子至onnx

如何导出rot90算子至onnx 1 背景描述2 等价替换2.1 rot90替换(NCHW)2.2 rot180替换(NCHW)2.3 rot270替换(NCHW) 3 rot导出ONNX 1 背景描述 在部署模型时&#xff0c;如果某些模型中或者前后处理中含有rot90算子&#xff0c;但又希望一起和模型导出onnx时&#xff0c;可能会遇到…

基于51单片机直流电机PWM控制设计

直流电机驱动 &#x1f3b6;基于51单片机的PWM控制直流电机设计( proteus仿真程序报告讲解视频&#xff09;&#x1f3b6;主要功能&#xff1a;&#x1f3b6;仿真&#x1f3b6;程序设计&#xff1a; &#x1f3b6;设计报告&#x1f3b6;资料清单&#xff1a;资料网盘下载链接&a…

hivesql 将json格式字符串转为数组

hivesql 将json格式字符串转为数组 完整过程SQL在文末 json 格式字符串 本案例 json 字符串参考格式&#xff0c;请勿使用本数据 {"data": [{"province": 11,"id_card": "110182198903224674","name": "闾丘饱乾"…

gitee仓库使用教程

下载安装git&#xff1b;在本地项目文件夹右击鼠标点击Git Bash Here;输入git init&#xff0c;这个目录变成git可以管理的仓库&#xff0c;会出现一个.git文件夹&#xff0c;如果没出现的话需要选择“显示隐藏文件”&#xff08;不会的同学自行百度一下&#xff09; 4.绑定本地…

MySQL数据库如何实现跨服务器访问数据

点击上方蓝字关注我 在使用MySQL数据库时&#xff0c;很多同学经常会问&#xff0c;我能跨服务器访问另一库的数据么&#xff1f;得到的答案很多时候是让人失望的。那么如果真的需要访问&#xff0c;又不想使用拷贝表及数据的方式&#xff0c;可以实现么&#xff0c;又该如何实…

3.数据结构

3.1 数据结构分类 常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图&#xff0c;它们可以从“逻辑结构”和“物理结构”两个维度进行分类。 3.1.1逻辑结构&#xff1a;线性与非线性 逻辑结构揭示了数据元素之间的逻辑关系。在数组和链表中&#xff0c;数据按照…

056-第三代软件开发-软件打包

第三代软件开发-软件打包 文章目录 第三代软件开发-软件打包项目介绍软件打包1 下载 linuxdepoyqt 工具2 安装 linuxdepoyqt3 qmake配置4 打包程序 总结 关键字&#xff1a; Qt、 Qml、 linuxdeployqt、 Ubuntu、 AppImage 项目介绍 欢迎来到我们的 QML & C 项目&…

常见树种(贵州省):021冬青、连香树、白辛树、香合欢、云贵鹅耳枥、肥牛树、杜英、格木、黄连木、圆果化香树、南天竹

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、冬青 …

图解系列--Http

1.URI和URL 1.1.URL URL是统一资源定位符。URL正是使用 Web 浏览器等访问 Web 页面时需要输入的网页地址。比如&#xff0c;http://hackr.jp/就是 URL。 1.2.URI 统一资源标识符。 URI 用字符串标识某一互联网资源&#xff0c;而URL表示资源的地点&#xff08;互联网上所处的位…

Java 基础学习(一)Java环境搭建和基本数据类型

1 Java 开发环境搭建 1.1 Java 编程语言 1.1.1 什么是Java编程语言 语言是人类进行沟通交流的各种表达符号&#xff0c;方便人与人之间进行沟通与信息交换&#xff1b;而计算机编程语言则是人与计算机之间进行信息交流沟通的一种特殊语言&#xff0c;也有语法规则、字符、符…

【c++随笔14】虚函数表

【c随笔14】虚函数表 一、虚函数表&#xff08;Virtual Function Table&#xff09;1、定义2、查看虚函数表2.1、 问题&#xff1a;三种类型&#xff0c;包含一个int类型的class、一个int类型的变量、int类型的指针&#xff1a;这三个大小分别是多少呢&#xff1f;2.2、怎么发现…

Linux7安装mysql数据库以及navicat远程连接mysql

1.下载地址&#xff1a;MySQL :: Download MySQL Community Server 2.创建mysql目录将压缩包上传到该目录 mkdir /opt/mysql cd /opt/mysql3.解压压缩包 gzip mysql-8.1.0-1.el7.x86_64.rpm-bundle.tar tar -zxvf mysql-8.1.0-1.el7.x86_64.rpm-bundle.tar.gz 4.前置检查 ch…

STM32 F1 串口空闲中断 + DMA实现数据发送

DMA实现数据发送 文章目录 DMA实现数据发送前言一、DMA二、代码编写1.DMA2.USART3.main 前言 当你遇到通信数据量大的时候&#xff0c;可以使用 空闲中断 DMA 的方案来减轻 CPU 的压力。 或者 在进行stm32开发时&#xff0c;有时会遇到这种情况&#xff1a;需要在设备间进行数…

接口测试快速入门 以飞致云平台为例

飞致云电商API地址系统来自飞致云项目。接口API地址&#xff1a;https://gz.fit2cloud.com/swagger-ui.html 飞致云电商系统接口文档 V1.0&#xff1a;见 有道云笔记 该网站可以做接口测试练习。快速了解如何测试接口&#xff0c;如何做关联 系统基地址&#xff1a;https://g…

通用电气调查网络攻击和数据盗窃指控

通用电气正在调查有关威胁行为者在网络攻击中破坏了公司开发环境并泄露据称被盗数据的指控。 通用电气 (GE) 是一家美国跨国公司&#xff0c;业务涉及电力、可再生能源和航空航天行业。 本月早些时候&#xff0c;一个名为 IntelBroker 的威胁行为者试图在黑客论坛上以 500 美…

Linuxfork,写时拷贝

1.prinf隐藏的缓冲区 1.思考:为什么会有缓冲区的存在? 2.演示及思考? 1).演示缓存区没有存在感 那为什么我们感觉不到缓冲区的存在呢?我们要打印东西直接就打印了呢? 我们用代码演示一下: 比如打开一个main.c,输入内容如下: #include <stdio.h> int main() { …

二十七、微服务案例

目录 一、实现输入搜索功能 1、下载代码&#xff0c;在idea上打开 2、新建RequestParams类&#xff0c;用于接收解析请求 3、在启动类中加入客户端地址Bean&#xff0c;以便实现服务 4、编写搜索方法 5、新建返回分页结果类 6、实现搜索方法 7、编写控制类&#xff0c;…

docker打包前端镜像

文章目录 一、构建镜像二、查看本地镜像三、启动容器四、查看启动的容器五、保存镜像六、读取镜像七、创建镜像八、最后 docker官网 一、构建镜像 -t是给镜像命名&#xff0c;.(点)是基于当前目录的Dockerfile来构建镜像 docker build -t image_web .二、查看本地镜像 docke…

【数据结构】什么是队列?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;队列的定义 &#x1f4cc;队列的抽象数据类型 &#x1f4cc;队列的顺序存储结构 &#x1f4cc;队列的链式存储结构 结语 人生,是一个又一个小小的队列…

极客时间:使用本地小型语言模型运行网页浏览器应用程序。

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…