【C++】构造函数详解

📢博客主页:https://blog.csdn.net/2301_779549673
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

  • 📢前言
  • 🏳️‍🌈 什么是构造函数
  • 🏳️‍🌈 构造函数的特点
    • ❤️1. 函数名与类名相同
    • 🧡2. 无返回值。
    • 💛3. 对象实例化时系统会自动调用对应的构造函数。
    • 💚4. 构造函数应写尽写
  • 👥总结


📢前言

本篇博客主要介绍一下C++中的构造函数拷贝构造函数的特性及用法,至于与这一部分有关的析构函数运算符重载等内容就放在下次。


🏳️‍🌈 什么是构造函数

构造函数是特殊的成员函数,构造函数千万不要认为它是用来创建对象的,其实构造函数的主要任务并不是开空间创建对象,而是初始化对象

关于构造函数,可以理解为使用类实例化对象时,每一个对象都要进行初始化,都要进行调用初始化函数,这个操作是实例化对象的必要操作,那么有没有更好的方式来简化这个调用操作。于是C++便推出了构造函数


🏳️‍🌈 构造函数的特点

❤️1. 函数名与类名相同

顾名思义你类名取什么,函数名就是什么

就比如下面这样就是一种最基本的无参构造函数,它的函数名就是类名

#include<iostream>
using namespace std;
class Date
{
public://⽆参构造函数//可以认为是默认构造Date(){_year = 1;_month = 1;_day = 1;}private:int _year;int _month;int _day;
};

🧡2. 无返回值。

返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此,可以理解为可自定义内置初始化函数,仅用来初始化

比如说下面这就是一个带参数的构造函数

// 带参构造函数
Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}

💛3. 对象实例化时系统会自动调用对应的构造函数。

比如说下面这三种基本的构造函数方法都是可行的

public:// 1.⽆参构造函数// 可以认为是默认构造Date(){_year = 1;_month = 1;_day = 1;}// 2.带参构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}// 3.全缺省构造函数// 可以认为是默认构造/*Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}*/

但是你肯定会注意到我将第三点给注释掉了,这是因为如果第一种无参第三种全缺省构造函数都存在的话就会出现判定不清的问题。
在这里插入图片描述

还有就是一般C++语言是内置构造函数的,就是说如果类中没有显式定义构造函数即上述三种函数都没有,则C++编译器会自动生成⼀个无参的默认构造函数,但是其初始化数值就可能会因编译器而异

比如说笔者使用的VS2022的初始化值如下
在这里插入图片描述
另外,无参构造函数全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。

无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结一下就是不传实参就可以调用的构造就叫默认构造

💚4. 构造函数应写尽写

我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要用初始化列表才能解决,初始化列表,我们下个章节再细细讲解。

说明:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的原生数据类型如:int/char/double/指针等,自定义类型就是我们使用class/struct等关键字自己定义的类型。

大多数情况下,构造函数都需要我们自己去实现,少数情况类似于MyQueue且Stack有默认构造时,MyQueue自动生成的就可以用,应写尽写

比如下面代码,我们限时实现了类对象Stack,并在这里面自定义了构造函数,而MyQueue里直接利用Stack来定义成员变量来,就利用了Stack里的构造函数,所以就不用定义了

#include<iostream>
using namespace std;
typedef int STDataType;
class Stack
{
public:Stack(int n = 4){_a = (STDataType*)malloc(sizeof(STDataType) * n);if (nullptr == _a){perror("malloc申请空间失败");return;}_capacity = n;_top = 0;}private:STDataType* _a;size_t _capacity;size_t _top;
};
// 两个Stack实现队列
class MyQueue
{
public:private:Stack pushst;Stack popst;
};

👥总结

本篇博文对 构造函数 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

请添加图片描述

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

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

相关文章

windows服务器搭建区块链环境(node.js+truffle+ganache)

windows服务器搭建区块链环境&#xff08;node.jstruffleganache&#xff09; 1&#xff0c;安装node.js中文版的2&#xff0c;更改下载源3&#xff0c;安装truffle4&#xff0c;安装ganache&#xff08;可以跳过使用ganache-cli&#xff09;5&#xff0c;安装ganache-cli&…

starRocks搭建

公司要使用新的大数据架构&#xff0c;打算用国产代替国外的大数据平台。所以这里我就纠结用doris还是starrocks&#xff0c;如果用doris&#xff0c;因为是开源的&#xff0c;以后就可以直接用云厂商的。如果用starrocks就得自己搭建&#xff0c;但是以后肯定会商业化&#xf…

RSA加密、解密

后台加密使用Hutool工具类提供的方法&#xff0c;具体参考地址&#xff1a; https://doc.hutool.cn/pages/AsymmetricCrypto/#%E4%BB%8B%E7%BB%8D 前台&#xff1a; //引入相应工具类&#xff0c;从GitHub下载的deps: [hrqc.base.comp.Jsencrypt],onReady(){const methis;m…

医院护士站卫星电子钟,时间精准,为众人提供精确的时间引导

在医院这个充满紧张与关怀的环境中&#xff0c;每一刻的时间都承载着生命的重量。医院护士站卫星电子钟以其精准的时间显示&#xff0c;成为了为众人提供精确时间引导的重要存在。 一、医院卫星电子钟应用原因 首先&#xff0c;护士站是医院内信息交流和医疗服务协调的核心区域…

Springboot自定义banner启动动画

一、banner文件自定义编写 1、创建banner文件 banner文件的文件名称默认为“banner.txt”&#xff0c;这个在SpringApplication.java中定义的 一般自定义就新建一个banner.txt文件,放在项目resources中。这时在banner.txt中编写启动动画展示内容。例如&#xff1a; banner.t…

LangChain与正则表达式:探索文本匹配的强大工具

LangChain与正则表达式&#xff1a;探索文本匹配的强大工具 在编程和数据处理领域&#xff0c;正则表达式是一种用于匹配字符串中字符组合的强力工具。LangChain作为一个多语言处理工具链&#xff0c;其对正则表达式的支持取决于集成的语言处理库和框架。本文将探讨正则表达式…

【排序算法】—— 归并排序

归并排序时间复杂度O(NlongN)&#xff0c;空间复杂度O(N)&#xff0c;是一种稳定的排序&#xff0c;其次可以用来做外排序算法&#xff0c;即对磁盘(文件)上的数据进行排序。 目录 一、有序数组排序 二、排序思路 三、递归实现 四、非递归实现 一、有序数组排序 要理解归…

mysql(5.5)启动服务和环境配置

正常启动 参考&#xff1a;Javaweb基础之mysql回溯笔记(一) 总的来说就是在mysql的安装目录下&#xff0c;找到bin下面的msyqld.exe&#xff0c;双击即启动了mysql服务&#xff1b; 启动方式二 也可以直接找到windows的服务项进行启动&#xff0c;操作如下&#xff1a; 打开…

Mac电脑下运行java命令行出现:错误: 找不到或无法加载主类

mac 电脑 问题复现 随手写了一个main方法&#xff0c;想用命令行操作 进入 BlockDemo.java 所在目录&#xff1a; wnwangnandeMBP wn % cd /Users/wn/IdeaProjects/test/JianZhiOffer/src/main/java/com/io/wn wnwangnandeMBP wn % ls -l total 16 -rw-r--r-- 1 wangnan …

Flowable(一个开源的工作流和业务流程管理引擎)中与事件相关的一些核心概念

Flowable&#xff08;一个开源的工作流和业务流程管理引擎&#xff09;中与事件相关的一些核心概念 Flowable&#xff08;一个开源的工作流和业务流程管理引擎&#xff09;中与事件相关的一些核心概念&#xff0c;包括它们的作用和触发场景。以下是对这些内容的简要说明&#x…

换手机了怎么恢复微信聊天记录?教你3招实用技巧

随着科技的飞速发展&#xff0c;手机更新换代的速度也越来越快。当我们换上一部新手机时&#xff0c;最头疼的问题之一往往是如何将旧手机中的重要数据&#xff0c;尤其是微信聊天记录&#xff0c;迁移到新手机上。微信聊天记录不仅记录了我们的日常沟通&#xff0c;还承载了许…

踩坑日记 | 记一次流程图问题排查

踩坑日记&#xff1a;记一次流程图问题排查 标签&#xff1a; activiti | 流程 引言 今天排查了一个流程图问题&#xff0c;耗时2个小时终于解决&#xff0c;记录下来 现象 流程审批驳回报错&#xff1a;Unknown property used in expression: ${xxxx} 使用的是 activiti …

SQL注入:基于错误

SQL注入&#xff1a;基于错误 攻击者通过在SQL中插入错误的语法&#xff0c;触发数据库错误&#xff0c;从错误消息中获取有关数据库结构和数据的信息。 1、先决条件 没有进行统一的异常处理&#xff0c;接口访问报错直接响应给客户端 采用jdbcTemplate 操作数据库 PostMa…

[C/C++入门][循环]12、等差数列和等差数列末项计算

等差数列是什么&#xff1f; 想象一下&#xff0c;你获得了一个神奇的糖果盒&#xff0c;他有一个神奇的功能&#xff0c;每次你打开盒子时&#xff0c;里面都会多出同样数量的糖。你只要给里面放上1颗糖&#xff0c;然后想着可以多几颗&#xff0c;比如我希望打开的时候多两颗…

【C++练级之路】【Lv.26】类型转换

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 一、C风格类型转换1.1 隐式类型转换1.2 显式类型转换 二、C风格类型转换2.1 static_cast2.2 dynamic_cast2.3…

Python面试题:如何在 Python 中处理大数据集?

在 Python 中处理大数据集可能面临许多挑战&#xff0c;包括内存限制、计算性能和数据处理效率等。以下是一些处理大数据集的常见方法和技术&#xff1a; 1. 使用高效的数据处理库 1.1 Pandas Pandas 是一个强大的数据分析库&#xff0c;可以处理中等大小的数据集&#xff0…

配置Redis时yml的格式导致报错

报错如下 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:98) at org.springframework.test.context.su…

Unity 优化合集

1️⃣ 贴图优化 1. Read/Write Enable 这个属性勾选后允许你在运行时读取和写入纹理数据&#xff0c;这对于需要实时生成内容或者需要动态修改纹理的场合非常有用但在大部分情况下这是不必要的。如果打开这个属性&#xff0c;会使运行时贴图大小翻倍&#xff0c;内存中会额外…

gptpdf:使用大模型(如 GPT-4o)将 PDF 解析为 markdown。

今天给大家分享一个开源的项目&#xff0c; 使用视觉大语言模型&#xff08;如 GPT-4o&#xff09;将 PDF 解析为 markdown。 方法非常简单(只有293行代码)&#xff0c;但几乎可以完美地解析排版、数学公式、表格、图片、图表等。 使用 GeneralAgent lib 与 OpenAI API 交互。…

香橙派AIpro部署YOLOv5:探索强悍开发板的高效目标检测能力

香橙派AIpro部署YOLOv5&#xff1a;探索强悍开发板的高效目标检测能力 一、香橙派AIpro开箱使用体验 1.1香橙派AIpro开箱 拿到板子后第一件事情就是开箱&#xff1a; 开箱后可以看见一个橘子的标识&#xff0c;也就是香橙派了&#xff0c;并且还有四个大字&#xff1a;为AI…