你想对构造函数说些什么?

回顾知识

在学习类的默认成员函数之前,先带大家复习一下什么是类,类是在C++中引进的新的类型,是一种自定义类型,实际上跟C语言中的结构体类似,但是是对结构体的升级,可以在类里面添加函数,也有对应的访问限定符private,public和protect;在C++中依旧可以使用结构体struct,因为C++要兼容C,只不过我们可以直接使用类名来实例化对象,还有一点就是class在不写访问限定符的时候,默认为private私有,而struct不写默认的是public,这也跟C++要兼容C有关,因为我们在C语言中struct的成员都是可以直接访问的。

一、 为什么要引入构造函数?

其实我们在实现一个日期类的时候,我们肯定是需求在实例化对象的时候就初始化好我们的日期,比如:2023年11月20日

在没有学习构造函数之前我们会怎么把日期传给我们的成员变量呢?来看下面的代码:

#include <iostream>
using namespace std;
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date date;date.Init(2023, 11, 20);date.Print();return 0;
}

所以我们在不知道构造函数的存在之前,我们只会这样初始化日期,其实准确来说并不是初始化,我们只是简单的赋值,而真正的初始化是在初始化列表中实现的,因为初始化列表只能允许成员变量出现一次,所以也就赋值一次,这才是初始化!我们回到正题,如果每次写类的时候,都要这样实现初始化,神都会觉得麻烦,基于这样的理念,我们的构造函数就诞生了

二、 什么是构造函数?

构造函数是一种特殊的成员函数,跟我们之前所有的函数模样都不一样。

  1. 构造函数不用写返回值
  2. 构造函数的函数名是类名
  3. 构造函数允许重载
  4. 构造函数是在实例化对象时自动调用的
  5. 构造函数的参数可以给缺省值

下面就是构造函数的写法:

class Date
{
public:Date(int year, int month, int day){_year  = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};

上面就是构造函数的一种简单的写法,构造函数就是用来给成员变量赋值的,记住是赋值不是初始化,构造函数体内可以进行多次赋值,这跟初始化的概念截然不同,在后面讲的初始化列表才是初始化;还有一点就是我们显式地去写了构造函数,编译器就不会生成了,这也就是说明了,默认成员函数是编译器自己会生成的。既然我们可以写构造函数,编译器可以生成构造函数,那构造函数的分类是什么呢?

三、 构造函数分为哪几种?

构造函数分为下面两类:

  1. 显式构造函数:必须传参的,如半缺省,无缺省;
  2. 默认构造函数:不需要传参的,如全缺省,无参和编译器默认生成的;

注意事项:

  1. 默认构造函数只允许存在一个;
  2. 写了显式构造函数,编译器就不会生成默认构造函数;
  3. 对于自定义类型的成员变量,当前类的构造函数会调用这个自定义类型的默认构造函数,如果这个自定义类型没有默认构造,就会报错;

四、 什么是初始化列表?

其实最常用的并不是构造函数,而是我们的初始化列表,它的存在解决了对于必须在定义的时候初始化的变量,和一些没有默认构造函数的自定义类型。

使用规则:冒号开头,逗号接应,末尾没有分号

class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};

注意事项

  1. C++11 中针对内置类型成员不初始化的缺陷,又打了补丁。即:内置类型成员变量在类中声明时可以给默认值,其实就是给的初始化列表。
  2. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

五、 对构造函数的提问

1. 为什么要自己写构造函数?

给大家举两个例子:

  1. 第一个是在日期类,编译器生成的默认构造函数是没办法给我们的日期正常赋值的,会赋值,但是是给随机值,所以不满足我们的需求,我们会写构造函数,给正确的值;
  2. 第二个是栈,顺序表,链表,二叉树等需要申请资源,开辟空间的,我们的编译器生成的默认构造函数,是没办法进行malloc和realloc等操作的,所以我们要自己写一个构造函数来开辟空间;
  3. 综上所述,我们写构造函数的原因就是基于编译器生成的默认构造函数没办法提供我们正常的需求。

2. 对于成员变量是自定义类型,我们如何构造?

大家在这里,要知道凡是类里面有自定义类型,无论是默认构造函数还是显式构造函数,都会调用这个自定义类型自己的默认构造函数。如果这个自定义类型没有默认构造函数,编译器会报错。

3. 初始化列表和构造函数的区别与联系?

区别:

  1. 我们构造函数准确的来说,不是给成员变量初始化,因为初始化只有一次,而我们的构造函数的内部可以多次给一个成员变量赋值,所以构造函数不是初始化,是赋值;
  2. 而初始化列表中的成员变量只会出现一次,所以就只会初始化一次。

关系:

  1. 可以在初始化列表和构造函数体内部同时使用,当我们需要一些变量初始化时需要条件判断,就要放在构造函数体内部。
  2. 能用初始化列表都用初始化列表,除非必须用构造函数。

4.为什么一定要用初始化列表来初始化引用和const类型?

因为我们在没有初始化列表的时候,我们写了构造函数,但是会发现这样一个现象,当没有进入构造函数的时候,成员变量都是随机值,那这个随机值是在哪里给的呢?答案就是初始化列表,所以初始化列表是一直存在的,只不过在没有显式地写的情况下,是默认给随机值的。

  1. 了解这些之后,我们再来谈谈const修饰的成员变量,因为const修饰的变量只能初始化一次,不可以被修改,所以在我们不写初始化列表时,默认的初始化列表就会初始化一次const,那接下来我们又在构造函数体内部赋值是肯定错误的;
  2. 那对于引用这样的变量,必须是在定义的时候初始化,如果我们不使用初始化列表,引用类型的成员变量就是默认初始化列表的随机值的别名,因为引用是改变不了指向的对象的,所以就会出错;基于这个原因,引用才必须在初始化列表中初始化;

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

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

相关文章

借駐conda安裝evo

代碼如下&#xff1a; conda create -n evo python3.8 conda activate evo pip install evo --upgrade --no-binary evo 然後耐心等待一下&#xff0c;即可順利安裝。前提是電腦里有conda&#xff01;

windows上安装MySQL Server.

进入官网 MySQL 找到 下载&#xff0c;并点进入。 往下翻&#xff0c;找到社区下载&#xff0c;进入页面 选择 Mysql community Server 选择系统&#xff0c;下载 之后解压。 将解压文件夹下的bin路径添加到变量值中 配置初始化的my.ini文件 [mysqld] # 设置3306端口 port330…

Docker(镜像、容器、仓库)工具安装使用命令行选项及构建、共享和运行容器化应用程序

文章目录 前言&#x1f31f;一、Docker工具安装&#x1f31f;二、Docker命令行选项&#x1f30f;2.1.docker run命令选项&#xff1a;&#x1f30f;2.2.docker build命令选项&#xff1a;&#x1f30f;2.3.docker images命令选项&#xff1a;&#x1f30f;2.4.docker ps命令选项…

【日常总结】java JSON 转 实体类 (含多层嵌套)

一、场景 二、问题 三、解决方案 四、实战 1. 引入maven依赖 2. IEDA 安装lombok 插件 3. 安装 GsonFormPlu 插件 4. 使用 Stage 1&#xff1a;新建类&#xff0c;右键 选择 Generate Stage 2&#xff1a;选择 GsonFormatPlus Stage 3&#xff1a;将json复制其中&…

【Flink 问题集】The generic type parameters of ‘Collector‘ are missing

错误展示&#xff1a; Exception in thread "main" org.apache.flink.api.common.functions.InvalidTypesException: The return type of function main(CollectionDemo.java:33) could not be determined automatically, due to type erasure. You can give type in…

【揭秘Vue】nextTick的神秘面纱:原理与作用一览无余!

前言 - JavaScript执行原理EventLoop JavaScript执行原理涉及到Event Loop&#xff08;事件循环&#xff09;的概念。JavaScript是一种单线程语言&#xff0c;意味着它一次只能执行一个任务。然而&#xff0c;JavaScript经常需要处理异步任务&#xff0c;比如网络请求、定时器…

研究前沿| Nature:艰难梭菌引发肠道神经源性炎症的新机制

前言 艰难梭菌感染&#xff08;Clostridioides difficile infection&#xff09;是目前发达国家医院和社区内获得性肠道细菌感染腹泻的最主要原因之一。在美国&#xff0c;每年有约50万例病例和导致约29,000例死亡。艰难梭菌&#xff08;C. difficile&#xff09;是一种产生孢子…

sftp 从windows10向linux(centos7)传输文件

前言背景&#xff1a;该示例是需要从windows10向本地linux系统传输一个qt安装文件&#xff0c;不想或者无法安装xftp这些传输工具&#xff0c;直接通过命令传输&#xff1b; 首先保证windows10 ping通linux系统ip&#xff0c;linux ping 通windows10系统&#xff1b; 注意&am…

Linux:动静态库

目录 一、软硬链接 1、软链接 2、硬链接 二、动态库和静态库 编写一个库 ①静态库 使用静态库的方法 ②动态库 使用动态库的方法 库存在的意义 一、软硬链接 软硬链接的本质区别就是&#xff1a;有无独立的inode 软链接有独立的inode&#xff0c;也就意味着软链接是一…

Java(三)(static,代码块,单例设计模式,继承)

目录 static 有无static修饰的成员变量 有无static修饰的成员方法 static的注意事项 代码块 静态代码块 实例代码块 单例设计模式 饿汉式单例写法 懒汉式单例写法 继承 基本概念 注意事项 权限修饰符 单继承 object 方法重写 子类方法中访问其他成员(成员变量…

虹科分享 | PEAK版本升级,看看有没有你关注的新功能?

号外号外&#xff01;近期PEAK进行了重要的版本升级&#xff0c;这次升级带来了许多令人兴奋的功能优化&#xff0c;助力您的工作流程更加便捷高效。为了帮助您更好地了解PEAK新版本&#xff0c;我们提供了详细的说明和指导&#xff0c;快来看看有没有你关注的新功能&#xff1…

【2023春李宏毅机器学习】快速了解机器学习基本原理

文章目录 机器学习约等于机器自动找一个函数 机器学习分类 regression&#xff1a;输出为连续值classification&#xff1a;输出为一个类别structured learning&#xff1a;又叫生成式学习generative learning 生成有结构的物件&#xff08;如&#xff1a;影像、句子&#xf…

【每日一题】53. 最大子数组和-2023.11.20

题目&#xff1a; 53. 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2…

色彩的基础知识——适用于camera tuning

#灵感#AWB CC是图像调优中的一个重要色彩部分&#xff0c;了解一些色彩知识。 目录 1、光谱的颜色-------滤光片、颜色风格 2、人眼的明暗视觉-----------侧向光学&#xff0c;对比度、色噪 3、视觉残留-------帧率 4、颜色的明度、色调、饱和度 5、三基色 RGB---------调…

CRM系统怎样帮助企业提高客户服务能力?

在企业的经营过程中&#xff0c;绝不是追求“一锤子买卖”&#xff0c;而是与客户建立长期稳定的关系&#xff0c;从而获得更多的收益。CRM客户关系管理系统顾名思义&#xff0c;就是帮助企业管理客户关系的软件。下面说说&#xff0c;如何通过CRM提高客户服务能力? CRM可以帮…

融合语言模型中的拓扑上下文和逻辑规则实现知识图谱补全11.18

融合语言模型中的拓扑上下文和逻辑规则实现知识图谱补全 摘要1 引言2 相关工作2.1 事实嵌入法2.2 拓扑嵌入方法2.3 规则融合方法2.4 基于LM的方法 3 准备3.1 知识图谱和拓扑上下文3.2 KG中的逻辑规则4.3 三元组嵌入 5 实验和结果5.1 数据集和评价指标 摘要 知识图补全&#xf…

Vue图片URL转File实践[已解决跨域问题]

async imgToFile(url) {const self thisconst image new Image()//let url "https://shenjianblog.oss-cn-shanghai.aliyuncs.com/pic/20220612/sfxs.jpg"// 使用 fetch 获取图像作为 Blob 对象const response await fetch(url.replace("https://shenjianbl…

【算法心得】minus instead of add

https://leetcode.com/problems/minimum-amount-of-time-to-collect-garbage/description/?envType=daily-question&envId=2023-11-20 Here is my code: function garbageCollection(garbage: string[], travel: number[]): number