类和对象:构造函数

news2024/11/13 9:36:44

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化对象。构造函数的本质是要替代我们以前Stack和Date类中写的Init函数(初始化)的功能,构造函数⾃动调⽤的特点就完美的替代的了Init。

构造函数的特点:
1. 函数名与类名相同;
2. ⽆返回值; (返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此)
3. 对象实例化时系统会⾃动调⽤对应的构造函数;
4. 构造函数可以重载;(也就是可以函数重载)
代码演示:

#include<iostream>
using namespace std;
 
class Date
{
public:
	// 1.⽆参构造函数
	Date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}
	// 2.带参构造函数
	Date(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 d1;
	d1.Print();
 
	//调用第二个:带参的构造函数(函数重载),可以按F11去看看
	Date d2(2024, 7, 15);
	d2.Print();
 
	//注意:无参不能加括号,对象没有被定义出来,因为和函数声明区分不开
	//Date d3();
	//d3.Print();
 
	//函数声明样例:
	//Date func();
	//func.Print();
	return 0;
}
class Date
{
public:
	// 全缺省构造函数(全缺省和无参,是函数重载,但存在调用歧义)(可以兼备前两个)
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
 
	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
 
int main()
{
	Date d1;
	d1.Print();
 
	Date d2(2024, 7, 15);
	d2.Print();
 
	Date d3(2024);
	d3.Print();
	return 0;
}

5. 如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参 的 默认构造函数(注意全缺省也算),⼀旦用户 显式 定义编译器将不再⽣成;
6. ⽆参构造函数、全缺省构造函数、我们不写构造时编译器默认⽣成的构造函数,都叫做默认构造函数。但是这三个函数有且只有⼀个存在,不能同时存在。 ⽆参构造函数和全缺省构造函数虽然构成函数重载,但是调⽤时会存在歧义。实际上⽆参构造函数、全缺省构造函数也是默认构造,总结⼀下就是不传实参就可以调⽤的构造就叫默认构造;
7. 我们不写,编译器默认⽣成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。对于⾃定义类型成员变量,要求调⽤这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要⽤ 初始化列表 才能解决;
这是我的VS2022编译器:

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

不难发现,第一个问题可以看出,默认的表现并不能完全满足我们的要求

看看吧:(栈的构造函数):

#include<iostream>
using namespace std;
typedef int STDataType;
class Stack
{
public:
	//当没有默认构造时:Stack(int n)//会报错:这自己生成不了了·······
	Stack(int n = 4)//因为缺省,知道多少给多少,不知道的就默认给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;
	int size;//自动生成的构造对内置类型的初始化是不确定的//加这句就是一个坑,但也有方法可以解决
};
// 两个Stack实现队列
class MyQueue
{
public:
	//编译器默认⽣成MyQueue的构造函数调⽤了Stack的构造,完成了两个成员的初始化
private:
	Stack pushst;//重Stack中找,我们写的全缺省Stack就是他要调用的默认构造函数
	Stack popst;
};
int main()
{
	MyQueue mq;
	return 0;
}

总结:

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

---------应写尽写(构造函数的特点)

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

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

相关文章

通过splunk web服务将服务器上文件下载到本地

1. 需求说明 工作中经常遇到需要将服务器上的文件下载到本地&#xff0c;但是由于各种网络环境限制&#xff0c;没办法使用winscp或者xftp工具&#xff0c;那么如何将服务器上的文件下载下来呢&#xff1f; 这里提供一种思路: 如果服务器上安装有web服务&#xff0c;可将待下…

MongoDB教程(十四):MongoDB查询分析

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、查询分…

防火墙之内容安全过滤技术篇

深度行为检测技术&#xff1a;是一种基于应用层的流量检测和控制技术 DPI:针对完整的数据包&#xff0c;进行内容的识别和检测 基于应用网关的检测技术 --- 有些应用控制和数据是分离的&#xff0c;比如一些视频流。一开始会通过TCP协议链接之后&#xff0c;协商一些参数&#…

扩容升级丨极海正式推出G32A1465系列汽车通用MCU,驱动智驾再进阶

继2023年推出G32A系列汽车通用平台首发产品G32A1445系列后&#xff0c;极海宣布正式推出G32A1465系列全新汽车通用MCU&#xff0c;以满足日益增长的智能驾驶应用需求。作为升级迭代产品&#xff0c;G32A1465专为应用范围不断扩大的高运算要求而设计&#xff0c;集成丰富的通信接…

服务器证书基于 OpenSSL一键颁发脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

【Vue】深入了解 Axios 在 Vue 中的使用:从基本操作到高级用法的全面指南

文章目录 一、Axios 简介与安装1. 什么是 Axios&#xff1f;2. 安装 Axios 二、在 Vue 组件中使用 Axios1. 发送 GET 请求2. 发送 POST 请求 三、Axios 拦截器1. 请求拦截器2. 响应拦截器 四、错误处理五、与 Vuex 结合使用1. 在 Vuex 中定义 actions2. 在组件中调用 Vuex acti…

Elasticsearch:Retrievers 介绍 - Python Jupyter notebook

在今天的文章里&#xff0c;我是继上一篇文章 “Elasticsearch&#xff1a;介绍 retrievers - 搜索一切事物” 来使用一个可以在本地设置的 Elasticsearch 集群来展示 Retrievers 的使用。在本篇文章中&#xff0c;你将学到如下的内容&#xff1a; 从 Kaggle 下载 IMDB 数据集…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-21 VTC视频时序控制器设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

SpringDoc2问题汇总

在项目中尝试使用SpringDoc进行文档生成&#xff0c;在使用过程中遇到一系列的问题加以记录. 1.引入依赖 只是单纯的使用SpringDoc的话不需要引入一些乱七八糟的依赖&#xff0c;如今各种增强和拓展依赖层出不穷&#xff0c;但是随着这些依赖的出现带来的不仅是增强&#xff0…

【BUG】已解决:ModuleNotFoundError: No module named ‘PIL‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘PIL‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named ‘PIL‘ 【常见模块错误】 错误原因&#xff1a; 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我…

【性能优化】在大批量数据下使用 HTML+CSS实现走马灯,防止页面卡顿

切换效果 页面结构变化 1.需求背景 项目首页存有一个小的轮播模块,保密原因大概只能这么展示,左侧图片右侧文字,后端一次性返回几百条数据(开发环境下,生产环境只会更多).无法使用分页解决,前端需要懒加载防止页面卡顿 写个小demo演示,如下 2.解决思路 获取到数据后,取第一…

Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析

Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析 简介 本文档适用于合宙Air780E、Air780EP、Air780EQ、Air201 关联文档和使用工具&#xff1a; 从Ramdump里分析内存泄漏问题 无法抓底层log的情况下如何导出死机dump Luatools下载调试工具 EPAT抓取底层日志 F…

品牌媒体邀约的流程及注意事项

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 品牌媒体邀约是一个复杂但重要的公关策略&#xff0c;能够帮助企业提高曝光率、树立品牌形象并传递信息。以下是品牌媒体邀约的流程及注意事项&#xff1a; 一、品牌媒体邀约流程 明确目…

Xcode如何创建多个工程

在Xcode中创建如何创建下图所示的工程呢&#xff1f;即在工程下有四个子项目&#xff0c;且四个子项目不同时运行&#xff0c;每次只运行一个。使用Visual Studio C的话不过是基操而已&#xff01; 1.首先创建工程&#xff0c;即图中的“Project” 1.1 打开Xcode&#xff0c…

像 MvvmLight 一样使用 CommunityToolkit.Mvvm 工具包

文章目录 简介一、安装工具包二、实现步骤1.按照MvvmLight 的结构创建对应文件夹和文件2.编辑 ViewModelLocator3.引用全局资源二、使用详情1.属性2.命令3. 消息通知4. 完整程序代码展示运行结果简介 CommunityToolkit.Mvvm 包(又名 MVVM 工具包,以前称为 Microsoft.Toolkit…

使用Python爬虫下载视频源码

一、引言(●ˇ∀ˇ●) 在当今互联网时代&#xff0c;视频内容已成为人们获取信息和娱乐的重要方式。有时&#xff0c;我们可能希望将这些视频下载到本地&#xff0c;以便在没有网络的情况下观看。本文将介绍如何使用Python编写一个简单的爬虫。 二、环境准备&#x1f618; 在…

ThinkPad改安装Windows7系统的操作步骤

ThinkPad&#xff1a;改安装Windows7系统的操作步骤 一、BIOS设置 1、先重新启动计算机&#xff0c;并按下笔记本键盘上“F1”键进入笔记本的BIOS设置界面。 2、进入BIOS设置界面后&#xff0c;按下键盘上“→”键将菜单移动至“Restart“项目&#xff0c;按下键盘上“↓”按键…

pdf转换器哪个好?PDF转word工具分享

pdf转换器哪个好&#xff1f;选择PDF转换器可以极大地提升我们的工作效率与灵活性。它不仅能够轻松实现PDF文件与其他格式&#xff08;如Word、Excel、图片等&#xff09;之间的互转&#xff0c;满足多样化的文件处理需求&#xff1b;还能在保持文件内容完整性的同时&#xff0…

“信息科技风险管理”和“IT审计智能辅助”两个大模块的部分功能详细介绍:

数字风险赋能中心简介 数字风险赋能中心简介 &#xff0c;时长05:13 大家好&#xff01;我是AI主播安欣&#xff0c;我给大家介绍一下数字风险赋能中心。 大家都知道当前我国政企机构的数字化转型已经进入深水区&#xff0c;数字化转型在给我们带来大量创新红利的同时&#xf…

ForCloud全栈安全体验,一站式云安全托管试用 开启全能高效攻防

对于正处于业务快速发展阶段的企业&#xff0c;特别是大型央国企而言&#xff0c;日常的安全部署和运营管理往往横跨多家子公司&#xff0c;所面临的挑战不言而喻。尤其是在面对当前常态化的大型攻防演练任务时&#xff0c;难度更是呈“几何级数”上升&#xff1a; 合规难 众…