【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;
};

👥总结

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

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

请添加图片描述

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

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

相关文章

【开源 Mac 工具推荐之 1】gibMacOS:方便快捷的 macOS 完整包下载 Shell 工具

简介 gibMacOS 是由 GitHub 开发者 corpnewt 编写的一款 Shell 工具。它采用 Python 编程语言&#xff0c;可以让用户打开后在纯文本页面中轻松选择并下载来源于 Apple 官方的 macOS 完整安装包。 Repo 地址&#xff1a;https://github.com/corpnewt/gibMacOS &#xff08;其…

阿里通义音频生成大模型 FunAudioLLM 开源

简介 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的进步极大地改变了人类与机器的互动方式&#xff0c;特别是在语音处理领域。阿里巴巴通义实验室最近开源了一个名为FunAudioLLM的语音大模型项目&#xff0c;旨在促进人类与大型语言模型&#xff08;LLMs&…

HTML+CSS博客文章列表

源代码在图片后面 点赞❤️收藏⭐️关注&#x1f495; 图示 感谢各位大佬支持 &#x1f618;&#x1f618;&#x1f618; 源代码 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>博…

解决ESLint和Prettier冲突的问题

在配置了ESLint的项目中使用Prettier进行格式化可能会出现冲突&#xff0c;不如Prettier配置了使用双引号&#xff0c;ESLint配置了单引号&#xff0c;当然可以一个一个改成一样的配置&#xff0c;但是比较麻烦。我发现可以直接使用ESLint的规则进行格式化。在VSCode配置过程如…

springmvc1

以前的servlet程序&#xff1a; springmvc 不同的处理器&#xff1a;不同的方法或者处理类 所有的请求都会经过dispathcherservlet的doservice方法&#xff1a; mvc原理&#xff1a; 前端控制器&#xff1a;jsp或者什么东西

AutoMQ 中的元数据管理

本文所述 AutoMQ 的元数据管理机制均基于 AutoMQ Release 1.1.0 版本 [1]。 01 前言 AutoMQ 作为新一代基于云原生理念重新设计的 Apache Kafka 发行版&#xff0c;其底层存储从传统的本地磁盘替换成了以对象存储为主的共享存储服务。对象存储为 AutoMQ 带来可观成本优势的…

【C++】初识C++(下)

前言 本篇博客继续总结一下C入门的一些小知识 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;C 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 1.引用 1.1引用的概念 1.2const引用 1.3指针和引用的…

外包干了1个月,技术明显退步。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

软件测试面试题全网独家没有之一的资深测试工程师面试题集锦

1.自我介绍&#xff1f; 我是谁、工作几年、你上家公司做什么、负责什么、你的优势、为什么适合这个职位、我想做什么、在这个职位上想得到什么 有自信、不能吞吞吐吐 时间长度2-3分钟 2编写测试用例有哪几种方法&#xff1f; 等价类、边界值、因果图、流程分析、错误分析、…

【Pytorch】数据集的加载和处理(一)

Pytorch torchvision 包提供了很多常用数据集 数据按照用途一般分为三组&#xff1a;训练&#xff08;train&#xff09;、验证&#xff08;validation&#xff09;和测试&#xff08;test&#xff09;。使用训练数据集来训练模型&#xff0c;使用验证数据集跟踪模型在训练期间…

ectype:拓展ctype

拓展C库的ctype模块&#xff0c;将字节块或字符串进行分类或转换。

SQL Server 创建用户并授权

创建用户前需要有一个数据库&#xff0c;创建数据库命令如下&#xff1a; CREATE DATABASE [数据库名称]; CREATE DATABASE database1; 一、创建登录用户 方式1&#xff1a;SQL命令 命令格式&#xff1a;CREATE LOGIN [用户名] WITH PASSWORD 密码; 例如&#xff0c;创建…

全球DeepFake攻防挑战赛DataWhale AI 夏令营——图像赛道

全球DeepFake攻防挑战赛&DataWhale AI 夏令营——图像赛道 赛题背景 随着人工智能技术的迅猛发展&#xff0c;深度伪造技术&#xff08;Deepfake&#xff09;正成为数字世界中的一把双刃剑。这项技术不仅为创意内容的生成提供了新的可能性&#xff0c;同时也对数字安全构…

Mac 息屏不断网

这里息屏指的是屏幕不黑&#xff0c;屏幕黑了好像必断网 我的系统是 14.5 我调整了两个地方&#xff0c;一个是电池——选项——唤醒以供访问 另外一个地方是锁定屏幕——延长关闭显示器的时间&#xff08;让显示器不黑&#xff09;

如何批量删除重复数据?推荐两种方法

在日常的办公中&#xff0c;很多用户都会使用Excel。借助这款软件&#xff0c;用户可以完成对各种数据的处理。但很多时候我们会发现&#xff0c;同一张表格里有很多重复的数据&#xff0c;这或许会为统计带来错误。为此&#xff0c;我们就需要删除重复项才可以帮助我们很好的解…

STM32+三色LED智能调光系统源程序 易安卓APP 原理图

资料下载地址&#xff1a;STM32三色LED智能调光系统源程序 易安卓APP 原理图 三色LED手机智能调光系统概述&#xff1a; 利用开发的智能手机软件&#xff0c;对照明三色LED进行智能调光。包含的功能有&#xff0c;支持多手机同时连接服务端&#xff0c;互动调光。支持关…

前端Vue组件化实践:打造仿京东天猫商品属性选择器组件

在前端开发领域&#xff0c;随着业务需求的日益复杂和技术的不断进步&#xff0c;传统的整体式应用开发模式已逐渐显得捉襟见肘。面对日益庞大的系统&#xff0c;每次微小的功能修改或增加都可能导致整个逻辑结构的重构&#xff0c;形成牵一发而动全身的困境。为了解决这一问题…

昇思25天学习打卡营第22天|ResNet50图像分类

上回说到RESNET50做迁移学习&#xff0c;今天看一下他在图片分类上面的表现。图像分类是最基础的计算机视觉应用&#xff0c;属于有监督学习类别&#xff0c;先喂一堆猫的照片告诉他这是猫&#xff0c;再喂一堆狗的图片告诉他这是狗。 CIFAR-10数据集共有60000张32*32的彩色图…

ARDUINO最新pinMode()管脚设置方法(24年7月)

Arduino管脚配置 ESP32 Arduino管脚配置测试正常。 pinMode&#xff08;&#xff09; [数字 I/O] 描述 将指定的引脚配置为输入或输出。有关引脚功能的详细信息&#xff0c;请参阅数字引脚部分。 可以使用模式INPUT_PULLUP使能内部上拉电阻。此外&#xff0c;INPUT模式明…

涨知识了!AI绘画变现的几个思路!

风口&#xff01;风口&#xff01;风口&#xff01; 终于不用再抱怨 “我们这代人啊&#xff0c;什么也没赶上” 因为我们现在正处于风口之上&#xff01; 在当今数字化的时代 AI 绘画正以惊人的速度崛起 并向各行各业渗透 既然阻止不了时代的变化 那就让它为我们所用 …