当前位置: 首页 > news >正文

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

👥总结

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

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

请添加图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 机器人及其相关工科专业课程体系
  • 批量提取PDF指定区域内容到 Excel , 根据PDF文件第一行文字来自动重命名v1.3-附思路和代码实现
  • qt 返回上级页面
  • Java如何使用 HttpClientUtils 发起 HTTP 请求
  • C++(week11): C++基础 第六章:关联式容器 set、map
  • 2 Java的基本程序设计结构(基本语法1)
  • 外包干了1个月,技术明显退步。。。
  • SparkStreaming--scala
  • Apache访问机制配置
  • 阿里通义音频生成大模型 FunAudioLLM 开源
  • el-popover或el-popconfirm中button不展示问题
  • 从零开始学习c++全套通关系列(第二章)万字总结,建议收藏!
  • 混合贪心算法求解地铁线路调度
  • 结合C++智能指针聊聊观察者模式
  • WPF 框架 Prism IActiveAware接口使用
  • 《深入 React 技术栈》
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【mysql】环境安装、服务启动、密码设置
  • 30秒的PHP代码片段(1)数组 - Array
  • AHK 中 = 和 == 等比较运算符的用法
  • Java深入 - 深入理解Java集合
  • java中具有继承关系的类及其对象初始化顺序
  • Mac转Windows的拯救指南
  • Mybatis初体验
  • ReactNativeweexDeviceOne对比
  • Spring声明式事务管理之一:五大属性分析
  • 从PHP迁移至Golang - 基础篇
  • 给新手的新浪微博 SDK 集成教程【一】
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前端
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 删除表内多余的重复数据
  • 深入浅出Node.js
  • 什么软件可以剪辑音乐?
  • 思维导图—你不知道的JavaScript中卷
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (四)linux文件内容查看
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (一)SvelteKit教程:hello world
  • (转)JAVA中的堆栈
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net dataexcel 脚本公式 函数源码
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @AliasFor 使用
  • @property @synthesize @dynamic 及相关属性作用探究
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [BZOJ] 3262: 陌上花开
  • [C++] 从零实现一个ping服务