P16 C++构造函数

news2024/11/30 13:39:27

目录

前言

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.coloradmin.cn/o/1255878.html

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

相关文章

2023年最新Visual Studio下载安装以及C语言环境搭建教程(含C语言入门教程)

文章目录 写在前面C语言简介Visual Studio简介Visual Studio安装教程 C语言入门Visual Studio使用教程 写在后面 写在前面 2023年最新Visual Studio下载安装以及C语言环境搭建教程来啦&#xff01;一起来看看吧~ C语言简介 C语言是一种高级编程语言&#xff0c;由美国贝尔实…

卷积神经网络经典backbone

特征提取是数据分析和机器学习中的基本概念&#xff0c;是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征&#xff0c;也称为变量或属性&#xff0c;是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的特定特征或属性。 1.AlexNet paper&#…

NX二次开发UF_CURVE_ask_wrap_curve_parents 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_wrap_curve_parents Defined in: uf_curve.h int UF_CURVE_ask_wrap_curve_parents(tag_t curve_tag, tag_t * defining_face, tag_t * defining_plane, tag_t * defin…

【单调栈】子数组的最小值之和

import java.util.Deque; import java.util.LinkedList;/** 参考链接&#xff1a;https://leetcode.cn/problems/sum-of-subarray-minimums/solutions/1930857/gong-xian-fa-dan-diao-zhan-san-chong-shi-gxa5/* https://leetcode.cn/problems/sum-of-subarray-minim…

gitee仓库使用教程

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

Figma 插件学习(二)- 常用属性和方法

一. 如何调试figma插件 Plugins > Development > Show/Hide console 打开控制台即可开始调试 二.节点类型 根据不同的节点类型&#xff0c;也是会有不同的方法和属性&#xff0c;介绍几个常用节点类型 1.FrameNode 框架节点是用于定义布局层次结构的容器。它类似于HTM…

高校大学校园后勤移动报修系统 微信小程序uniapp+vue

本文主要是针对线下校园后勤移动报修传统管理方式中管理不便与效率低的缺点&#xff0c;将电子商务和计算机技术结合起来&#xff0c;开发出管理便捷&#xff0c;效率高的基于app的大学校园后勤移动报修app。该系统、操作简单、界面友好、易于管理和维护&#xff1b;而且对后勤…

弹窗concrt140.dll丢失的解决方法,深度解析concrt140.dll丢失的原因

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示或者系统崩溃的情况。其中&#xff0c;concrt140.dll是一个常见的错误提示&#xff0c;这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;本文将介绍5种详细的解决方法&#xff0c;帮助您恢…

I/O多路转接之epoll

承接上文 I/O多路转接之poll-CSDN博客 简介 epoll的相关系统调用 epoll底层原理 编写epoll的server 重新回归一下epoll原理&#xff0c;LT&#xff0c;ET epoll改成ET工作模式 -- 初识(有bug) epoll初识 按照man手册的说法: 是为处理大批量句柄而作了改进的poll. 它是在2.5.4…

所有网站文本复制方法(知网、百度文库等)

实现文字复制自由 在肝学校结课论文是发现要用的论文文字都无法复制&#xff0c;所以想到了以前学到的一个方法&#xff0c;开始忘了&#xff0c;突然想起来&#xff0c;现在记录一下。 拿我现在肝的课程结课论文为例&#xff1a; 方法一 在谷歌浏览器的网址前面有一个列表一…

WebSocket了解

一.什么是WebSocket WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 二.websocket的原理 web…

持续集成部署-k8s-配置与存储-存储类:动态创建NFS-PV案例

动态创建NFS-PV案例 1. 前置条件2. StorageClass 存储类的概念和使用3. RBAC 配置4. storageClass 配置5. 创建应用&#xff0c;测试 PVC 的自动配置6. 解决 PVC 为 Pending 状态问题7. 单独测试自动创建 PVC 1. 前置条件 这里使用 NFS 存储的方式&#xff0c;来演示动态创建 …

[NOIP2006]明明的随机数

一、题目 登录—专业IT笔试面试备考平台_牛客网 二、代码 set去重&#xff0c;再利用vector进行排序 std::set是一个自带排序功能的容器&#xff0c;它已经按照一定的规则&#xff08;默认是元素的小于比较&#xff09;对元素进行了排序。因此&#xff0c;你不能直接对std::s…

2.5 逆矩阵

一、逆矩阵的注释 假设 A A A 是一个方阵&#xff0c;其逆矩阵 A − 1 A^{-1} A−1 与它的大小相同&#xff0c; A − 1 A I A^{-1}AI A−1AI。 A A A 与 A − 1 A^{-1} A−1 会做相反的事情。它们的乘积是单位矩阵 —— 对向量无影响&#xff0c;所以 A − 1 A x x A^{…

【挑战业余一周拿证】一、亚马逊云科技简介 - 第 2 节 - 模块 简介

CSDN 官方中文视频&#xff08;免费&#xff09;&#xff1a;点击进入 第 2 节 - 模块 1 简介 这门课程将为您提供需要了解的所有重要信息&#xff0c;让您能够轻松讨论亚马逊云科技并了解它为 何对您的企业有利 亚马逊云科技为每个企业都提供了非常广泛的服务&#xff0c;从…

Vscode工具使用指南

通用 快捷键文件 / 编辑查找 / 替换窗口插件主题 连接linux 快捷键 文件 / 编辑 新建文件&#xff1a;CtrlN放大或缩小&#xff1a;Ctrl /-代码行缩进&#xff0c;展开&#xff1a;Ctrl[ 和 Ctrl]在当前行下方插入一行&#xff1a;CtrlEnter在当前行上方插入一行&#xff1a;…

Springboot+vue的客户关系管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的客户关系管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的客户关系管理系统&#xff0c;采用M&#xff08…

常见的1/2/3位数码管接线详解

今天玩数码管的时候接触到了数码管的接线&#xff0c;分享一下供刚开始接触的童鞋参考 首先了解什么是数码管 数码管是一种可以显示数字和其他信息的电子设备&#xff0c;是显示屏其中一类&#xff0c; 通过对其不同的管脚输入相对的电流&#xff0c;会使其发亮&#xff0c;从而…

VMware上面安装部署centos7镜像系统【详细含镜像】

VMware上面安装部署centos7镜像系统【详细含镜像】 废话不多说直接开始 下载centos7镜像 网上有好多&#xff0c;但是我相信来看小编文章的基本上应该都有centos7的镜像了吧&#xff0c;毕竟咱们都是同一类人&#xff0c;哈哈不卖关子了&#xff0c;小编直接给大家一个百度云盘…

意大利 地图 RV REG M A 是什么意思

Regionale分为 普通列车&#xff08;R/REG)&#xff1a;经停每一个小站 高速列车&#xff08;RV/RGV)&#xff1a;经停大站 上车前必须打票 没有指定座位&#xff0c;任意选座 M是地铁&#xff0c;A表示A线 sit bus shuttle是机场大巴